TL;DR
Windowsで複数のGit Reposを扱うときはsshでトンネルたくさん掘るんじゃなくてnamespace(credential.namespace)使ってHTTPSでやったほうがいいよ。
はじめに
お仕事でAアカウントのAWS CodeCommit、BアカウントのAWS CodeCommit、Azure DevOps、Github…といった具合にGit Reposが(悲しいことに、認証認可単位ごと)どんどこ増えて行くわけですが、みなさんも経験お有りじゃないでしょうか。
メンバーが「HTTPS接続のトークンだとWindowsだとリポジトリが上書きになっちゃうのでsshキー登録してます」「諦めてこのプロジェクトではMac使ってます」みたいなことになってきたので、改めてcredential helperとnamespaceについて整理することにしました。
この記事は何をしようとしているのか
異なる認可体系のGit Reposの認証認可状態について、PATをWindowsの資格情報マネージャを使って管理し、再認証不要にします。
この方法では、個別に設定するnamespaceでreposと認可情報を識別するので、reposのURLが被ってるのにアカウントが違うので覚えさせようとすると認証・認可状態が重複する、というようなケースに対応できるはず。(CodeCommitのとあるreposはIAM Aで、別のreposはIAM Bでのみアクセスできる、みたいな場合を想定。)
準備
まず、Gitクライアントが古い場合はアップデートしちゃいましょう。一昔まえまではWindowsのGit認可管理はwincredっていうcredential helperでやってたのですが、これがちょい前くらいにmanager(Git Credential Manager for Windows)に取って代わられており、さらに最近managerはmanager-core(Git Credential Manager またはGCM Core)に取って代わられています。
手っ取り早いのは、最新のGit for Windowsを用意し、インストーラーを注意深く見守ることです。
準備ができていると、credential.helperにmanager-coreが設定されているはず。
PS E:\hoge> git config --get credential.helper
manager-core
手元の環境ではすでにここで書いたことを設定済なので、初めてやる方は以下のコマンドの結果が変わってくるかもしれませんが、credential.<scheme>://<fqdn>.usehttppath true
になってるところが使いたいreposのURLに合ってないと駄目かもしれません。
PS E:\hoge> git config --get-regexp credential.+
credential.helper manager-core
credential.https://dev.azure.com.usehttppath true
設定例
Azure DevOps (dev.azure.comドメインでアクセス時)
VSTS時代からのユーザはtest.visualstudio.com
みたいになってるかもしれないのでその場合はアドレス直してください。
reposのURLは以下と仮定します。
https://{user-name}@dev.azure.com/{org-name}/{prj-name}/_git/{repos-name}
汎用資格情報の登録(ADO)
以下のように登録します。以下アドレス項目の、ado-test-git
が今回指定するgitのcredential namespaceです。
ユーザ名のPersonalAccessToken
はAzure DevOpsの場合決め打ちです。
※間違えてWindows資格情報を登録しようとするとうまくいかないので注意。
- インターネットまたはネットワークのアドレス:
- ado-test-git:https://{user-name}@dev.azure.com/{org-name}
- ユーザ名:
- PersonalAccessToken
- パスワード:
- Azure DevOpsで払い出したPAT
git clone(ADO)
Cloneするときにnamespaceを指定します。
git clone https://{user-name}@dev.azure.com/{org-name}/{prj-name}/_git/{repos-name} `
-c credential.namespace=ado-test-git
# -c credential.namespaceのところ、"="でつなぎ忘れないように。ぼくは10回はやった。
認証を問われることなくcloneできてればOK。
確認
cmdkeyで資格情報の登録状況確認します。
PS E:\hoge> cmdkey /list:ado*
結果(なんか一個増えてるな。。)
ado* のために現在保存されている資格情報:
ターゲット: ado-test-git:https://dev.azure.com/XXXX
種類: 汎用
ユーザー: PersonalAccessToken
ローカル コンピューターの常設
ターゲット: ado-test-git:https://XXXX@dev.azure.com/XXXX
種類: 汎用
ユーザー: PersonalAccessToken
ついでに、ローカルにできたreposの状態を確認します。
PS E:\hoge> Set-Location .\{prj-name}\
PS E:\hoge\{prj-name}> git config --local --get-regex cred*
結果(localのgit configのnamespaceが指定した内容になっている)
credential.namespace ado-test-git
GitHub
汎用資格情報の登録とgit cloneまで書きます。確認はADOと同じなので省略。
汎用資格情報の登録(GitHub)
Azure DevOpsと同様に汎用資格情報を登録していきます。今回のcredential namespaceはgithub-git
としました。
- インターネットまたはネットワークのアドレス:
- github-git:https://github.com/
- ユーザー名:
- GitHubで登録していてログインに使ってるメールアドレス(ユーザー名でもいけるかも)
- パスワード:
- GitHubで払い出したPAT
ちなみに、PATを払い出す場所がわかりにくいですが、以下にあります。
-
Settings
(右上のアイコンのところのメニュー項目にある)-
<> Developper setting
メニュー-
Personal access tokens
メニュー
-
-
git clone(GitHub)
Cloneするときにcredential namespaceを指定します。
# -c はkeyとvalueを"="でつなぐ。大事なことなので2回言いました
git clone https://github.com/{user-name}/{prj-name}.git `
-c credential.namespace=github-git
認証を問われることなくcloneできてればOK。
AWS CodeCommit
気持ちが高ぶったら書く