WindowsでGitの認証情報をcredential.namespaceと資格情報で管理し認可重複に耐える

## 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](https://github.com/microsoft/Git-Credential-Manager-for-Windows))に取って代わられており、さらに最近managerはmanager-core([Git Credential Manager またはGCM Core](https://github.com/GitCredentialManager/git-credential-manager))に取って代わられています。

手っ取り早いのは、最新のGit for Windowsを用意し、インストーラーを注意深く見守ることです。

準備ができていると、credential.helperにmanager-coreが設定されているはず。

```powershell
PS E:\hoge> git config --get credential.helper
manager-core
```

手元の環境ではすでにここで書いたことを設定済なので、初めてやる方は以下のコマンドの結果が変わってくるかもしれませんが、`credential.<scheme>://<fqdn>.usehttppath true`になってるところが使いたいreposのURLに合ってないと駄目かもしれません。

```powershell
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を指定します。

```powershell
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で資格情報の登録状況確認します。

```powershell
PS E:\hoge> cmdkey /list:ado*
```

結果(なんか一個増えてるな。。)

```text
ado* のために現在保存されている資格情報:

    ターゲット: ado-test-git:https://dev.azure.com/XXXX
    種類: 汎用
    ユーザー: PersonalAccessToken
    ローカル コンピューターの常設

    ターゲット: ado-test-git:https://XXXX@dev.azure.com/XXXX
    種類: 汎用
    ユーザー: PersonalAccessToken
```

ついでに、ローカルにできたreposの状態を確認します。

```powershell
PS E:\hoge> Set-Location .\{prj-name}\
PS E:\hoge\{prj-name}> git config --local --get-regex cred*
```

結果(localのgit configのnamespaceが指定した内容になっている)

```text
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を指定します。

```powershell
# -c はkeyとvalueを"="でつなぐ。大事なことなので2回言いました
git clone https://github.com/{user-name}/{prj-name}.git `
  -c credential.namespace=github-git
```

認証を問われることなくcloneできてればOK。



### AWS CodeCommit

気持ちが高ぶったら書く