2018年12月5日水曜日

Git(Source Tree)の認証情報の扱い(Authentication failedの解消)

GitのリポジトリをSource Treeで管理しているのですが、新しい環境で次のエラーが発生しリポジトリのクローンがうまくいきませんでした。


git -c diff.mnemonicprefix=false -c core.quotepath=false fetch origin
fatal: ArgumentException encountered.
   同一のキーを含む項目が既に追加されています。
fatal: ArgumentException encountered.
   同一のキーを含む項目が既に追加されています。
fatal: Authentication failed for 'https://xxxxxxxxxxxxxxxxx'
エラー終了しました。エラーの内容は上記をご覧ください。


上記エラーの情報を基に検索すると次のような情報が見つかります。
  • 内臓Gitの破損の可能性があるためGitを更新する
  • Gitをアンインストールしてから再インストールする
  • コントロールパネルの資格情報マネージャーのWindows資格情報 - 汎用資格情報でリポジトリのURLと紐付いた認証情報を修正する(コントロール パネル\すべてのコントロール パネル項目\資格情報マネージャー)
  • Source Treeのツール - オプション - 認証から認証情報をGitHubに変える

Gitの再インストールでも解決しなかったのですが、コントロールパネルに資格情報が存在しなかったことから、Git側の認証情報の保存に問題があると判断し調査を始めました。するとGitの認証情報の保存方法は選択式になっていることがわかりました。

設定されている認証情報の保存方法の確認

認証情報の保存方法は、git configの credential.helper で確認できます。通常は、「manager」となっており、Windowsの資格情報マネージャーに保存されるようになっていますが、私の環境ではうまく保存されていませんでした。

git config --list
すべての設定が出力されるので、credential.helperの項目を探す必要があります。重複した設定項目もすべて出力され、最後に表示された設定値が有効な設定値となります。「q」で終了できます。


credential.helper = manager

git config credential.helper
credential.helperの有効な値だけを表示します。値が存在しない時は何も表示されません。





利用可能な認証データキャッシュ方法の確認

次のどちらかのコマンドで利用可能な認証情報の保存先の一覧を確認できる。保存先にあるcredential-storeは平文で保管されるため、危険なので使わない。Windowsの資格情報マネージャーへの保管は、credential-wincred 。

git help -a | gawk '/credential-/ {print $1}'

git help -a | grep credential-




Gitの認証情報の保存先にWindowsの資格情報マネージャーを指定する

git config --global credential.helper wincred


Gitの認証情報の保存先を削除する
git configの削除には、--unset オプションを使用する。

git config --global --unset credential.helper

複数の値が登録されている場合、warning: credential.helper has multiple values エラーとなり削除できないことがある。その場合は、-unset-all オプションを使って削除する。

git config --global --unset-all credential.helper


参考

Git - 認証情報の保存
https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E8%AA%8D%E8%A8%BC%E6%83%85%E5%A0%B1%E3%81%AE%E4%BF%9D%E5%AD%98