git cloneできない時の調べ方と対策 〜AWS CodeCommit/Mac OSの場合〜

# はじめに
先日、AWSの[CodeCommit](https://aws.amazon.com/jp/codecommit/)を使っていてgit clone（with HTTPS）できずにはまった。クローンするURLは正しいことは何度も確認した。しかし、cloneしてもnot foundと表示される。何が起きているのか調査し、対策してみました。

# git cloneできない時の調べ方
## ログを詳細表示する
`git clone https://hogehoge`だけでは、詳細が表示されずに何が起きているのかわからない。しかし、`GIT_CURL_VERBOSE=1`をつけて実行すると詳細が表示されます。:smile:

```
% GIT_CURL_VERBOSE=1 git clone https://git-codecommit.ap-northeast-1.amazonaws.com/hogehoge/
* Couldn't find host git-codecommit.ap-northeast-1.amazonaws.com in the .netrc file; using defaults
*   Trying 52.119.218.16...
* TCP_NODELAY set
* Connected to git-codecommit.ap-northeast-1.amazonaws.com (nn.nn.nn.nn) port 443 (#0)
* ALPN, offering http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/cert.pem
  CApath: none
* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-SHA
* ALPN, server did not agree to a protocol
* Server certificate:
（以下省略）
```
とっても長いログが表示されます。**困った時には、このログをよーく見ましょう。**
今回のケースは、ログの後半で、なにやら見覚えのあるユーザー名が表示されていた。

```
* Server auth using Basic with user '*********(マスクしてます）'
```
別プロジェクトでAWS CodeCommitを使っていたユーザー名だ。今回は入力もしていないのに、どこから呼ばれているのかわからん。そこで、`git config`を調べてみた。

## credential.helper=osxkeychainって何よ
`git config`で調べてみたが、user.name の設定はしていない。認証まわりで関係のありそうなconfigはこれくらだ。

```
credential.helper=osxkeychain
```
設定した覚えが無い（おそらく過去に設定して忘れたと思われる:scream:）。そこで、Googles先生に聞いてみた。

- [Caching your GitHub password in Git](https://help.github.com/articles/updating-credentials-from-the-osx-keychain/)
- [Updating credentials from the OSX Keychain](https://help.github.com/articles/caching-your-github-password-in-git/)

様々な投稿がありましたけど、help.github.comには上記ページがあった。Mac OSのキーチェーンというものを使って、パスワードをキャッシュしていると。。。やはり設定した記憶が無い。:weary:

いつどこで設定したのはおいておき、`[アプリケーション]-[ユーティリティ]-[キーチェーンアクセス]`を開いてみました。100個以上の設定があり、その中で見つけました。:raised_hands:

<img width="525" alt="スクリーンショット 2018-12-17 17.23.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/77333/1dd0c365-2d6e-3617-44ed-5e6ec7f6aa78.png">

これだ、これ。（上のショットで、アカウントはAWS CodeCommitのアカウントが表示されていたので、削除してあります）
そこで、これを右クリックで削除メニューが表示されたので、削除してみて再度、`git clone`してみました。

```
$ git clone https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/hogehoge
Cloning into 'Test-codestar'...
Username for 'https://git-codecommit.ap-northeast-1.amazonaws.com':
```
username を聞いてきてくれました。:joy:

## 調べ方のまとめ
どこで認証情報を設定されているのかわからない時の調べ方。

- `GIT_CURL_VERBOSE=1 git clone https://hogehoge`で表示されるメッセージをよく見る。
- `credential.helper=osxkeychain`を設定している場合
   - [アプリケーション]-[ユーティリティ]-[キーチェンアクセス]を開いて、`git clone`するホストと同じ名前がないか調べてみる
- configに`user.name`を設定していないか調べてみる。systemとglobal共に調べましょう。
  - git config --global --list
  - git config --system --list
- ホームディレクトリに.netrc ファイルを設定していないか調べてみる
  - more ~/.netrc

# 同一ホストで複数アカウントを使っている時の対策
usernameを聞かれるようになったはいいが、gitリポジトリを切り替える時に、毎回、[キーチェーンアクセス]を開いて削除するのは面倒だ。そこで調べてみた。

## 対策1. git configの設定でURLを指定する
いろいろと試してみたところ、gitconfigにURLを指定すればよいことがわかりました。同一FQDNでusernameを切り替えたい場合はgitconfigには以下のように設定します。

```~/.gitconfig
[credential "リポジトリAのClone URL"]
        UseHttpPath = true
        helper = osxkeychain
[credential "リポジトリBのClone URL"]
        UseHttpPath = true
        helper = osxkeychain
[credential]
        helper = osxkeychain
```
これで、それぞれのリポジトリにcloneすると、なんとできます！！！
gitconfigでは、URLまで指定すれば、参照して欲しいkeychainを見れくれるようだ。

## 対策2. AWSのアクセスキーを払い出されている場合
AWSのドキュメントをよくよく見て見ると、”[Git 認証情報と AWS CodeCommit への HTTPS 接続のトラブルシューティング](https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/troubleshooting-gc.html)”のページがあった。この中で、AWS CLIの認証情報ヘルパーというものを使用できることがわかった。これを使うと、**AWS CodeCommit の HTTPS Git 認証情報が不要**で、AWSアクセスキーだけでアクセスできることがわかった。これを使って設定してみると、同一FQDNでもうまいこと認証できました。
CodeCommitを使っている場合は、こっちが正統派だと思う。

```
[credential "https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/hoge1"]
        helper = !aws codecommit credential-helper $@ --profile hoge1
        UseHttpPath = true
[credential "https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/hoge2"]
        helper = !aws codecommit credential-helper $@ --profile hoge2
        UseHttpPath = true
[credential]
        helper = osxkeychain
```

`profile hoge1`と`profile hoge2`は異なるAWSアカウントです。aws configureでそれぞれのprofileを設定済の状態です。
アクセスキーを払い出されている場合はこっちのほうがよいでしょう。これを使うと、アクセスキーがkeychainに保存されています。


## 対策3． 対策1も2も駄目な場合
最後に、ちょっと面倒な対策です。
コマンドラインからkeychainに保存されたusernameとパスワードを削除することができます。
[ここ](https://help.github.com/articles/caching-your-github-password-in-git/)を見ると、コマンドラインからeraseしている。`git credential-osxkeychain erase`は標準入力を待っているようなので、echoしてみた。

```
echo -e "host=git-codecommit.ap-northeast-1.amazonaws.com\nprotocol=https\n\n" | git credential-osxkeychain erase

```

お、これで削除できた！これを毎回コピペするのも面倒なので、aliasしておきました。

```~/.bash_profile
alias git-aws-passwd-reset='echo -e "host=git-codecommit.ap-northeast-1.amazonaws.com\nprotocol=https\n\n" | git credential-osxkeychain erase'
```
これで、`git-aws-passwd-reset` と入力するだけで、キャッシュされている認証情報を削除できます。面倒な人はaliasしておきましょう。認証情報を削除しているので、その度にusenameとパスワードを聞かれます。


# 最後に
AWSの複数アカウントでそれぞれCodeCommitを使用している場合だったけど、github.comにおいてもアカウントを切り替えたい場合*（そんな人がいますでしょうか？）*があるなら使える設定だと思います。
特殊な環境下の話でしたが、困った時にご参考いただければ幸いです。:bow:

## 環境情報
- git version 2.10.1
- macOS バージョン 10.13.6
- aws-cli/1.16.20 Python/3.6.2 Darwin/17.7.0 botocore/1.12.61


[:christmas_tree: FORK Advent Calendar 2018](/advent-calendar/2018/fork)
:arrow_left: 19日目 [前の日の記事のタイトル](/numatch00/items/f25fb0ae6cb418e1f2d5) @numatch00