33
28

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

FORKAdvent Calendar 2018

Day 20

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

Last updated at Posted at 2018-12-20

はじめに

先日、AWSの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先生に聞いてみた。

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

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

スクリーンショット 2018-12-17 17.23.06.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 接続のトラブルシューティング”のページがあった。この中で、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 hoge1profile 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しておきました。

~/.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
:arrow_left: 19日目 前の日の記事のタイトル @numatch00

33
28
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
33
28

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?