はじめに
先日、AWSのCodeCommitを使っていてgit clone(with HTTPS)できずにはまった。クローンするURLは正しいことは何度も確認した。しかし、cloneしてもnot foundと表示される。何が起きているのか調査し、対策してみました。
git cloneできない時の調べ方
ログを詳細表示する
git clone https://hogehoge
だけでは、詳細が表示されずに何が起きているのかわからない。しかし、GIT_CURL_VERBOSE=1
をつけて実行すると詳細が表示されます。
% 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
設定した覚えが無い(おそらく過去に設定して忘れたと思われる)。そこで、Googles先生に聞いてみた。
様々な投稿がありましたけど、help.github.comには上記ページがあった。Mac OSのキーチェーンというものを使って、パスワードをキャッシュしていると。。。やはり設定した記憶が無い。
いつどこで設定したのはおいておき、[アプリケーション]-[ユーティリティ]-[キーチェーンアクセス]
を開いてみました。100個以上の設定があり、その中で見つけました。
これだ、これ。(上のショットで、アカウントは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 を聞いてきてくれました。
調べ方のまとめ
どこで認証情報を設定されているのかわからない時の調べ方。
-
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には以下のように設定します。
[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 接続のトラブルシューティング”のページがあった。この中で、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とパスワードを削除することができます。
ここを見ると、コマンドラインから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しておきました。
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においてもアカウントを切り替えたい場合*(そんな人がいますでしょうか?)*があるなら使える設定だと思います。
特殊な環境下の話でしたが、困った時にご参考いただければ幸いです。
環境情報
- 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