windowsのgitコマンドのgithubマルチアカウント運用


環境

Windows10
git version 2.28.0.windows.1
wsl ubuntu git version 2.25.1

対象読者ではない人たちへ

git credential helperってなに?って人はこの記事を読む前に、こちらを読もう

この話とgit config user,git config emailは全く違う話で、これを混同してしまう人はこの記事を読む前に公式ドキュメントなどを読もう。

本題

windowsでgitを普通にinstallしたらおそらく標準で Git-Credential-Manager-for-Windowsがcredential.helperに設定されている
git config --system credential.helperがmanagerになってたら多分そう。

※wslでUbuntuを入れている人でそのへんを統合したい人は、Ubuntuの中のgitには、git config --system credential.helper '/mnt/c/Program\ Files/Git/mingw64/libexec/git-core/git-credential-manager.exe'としてしておこう。

これは、windowsのkeychain的な存在である"資格情報マネージャー"アプリ(スタートの検索のところに打てば出てくる)の、Windows資格情報と連動している。
git:https://github.comと書かれている認証情報が、それだ。

で、このGit-Credential-Manager-for-Windowsにはnamespaceという機能があるらしい。

これは、git configで設定可能な項目で、標準では gitで、前述のgit:https://github.comのprefixにあたる。

だから、別のアカウントで運用したいフォルダで git config --local credential.namespace name xxx (xxxはgit以外の好きな文字列)とすれば、資格情報マネージャー上では、xxx:https://github.comと書かれている認証情報となり、複数管理が可能となるのである。

2021年にもなってやっとハックではないgithubマルチアカウント運用方法を見つけたのである。

手順

メインで使っているいつものgithubアカウントとは別のsubアカウントで登録済のprivate-repositoryをcloneする手順をまとめる

一応はwindowsでの話なので、PowerShellか、wsl上のlinuxかあたりでオペレーションすることを想定している

$ mkdir {repo} # cloneするのではなく先に空のディレクトリを作る
$ cd {repo}
repo/ $ git init
repo/ $ git config --local credential.namespace name xxx # xxxは"git"以外の好きな文字列だが、githubアカウント名などが妥当だろう
repo/ $ git remote add origin {repo_https_url}
repo/ $ git pull # ここでGUIかCUIでusername/passwordを尋ねられる (2faを有効にした人はpasswordのかわrにpersonal_access_tokenを入力すること)

これだ。
あとはWindowsの資格情報マネージャーを起動し、Windows資格情報にxxx:https://github.comが追加されていることを確認しよう。

認証情報を消したくなったら、資格情報マネージャーを起動し、Windows資格情報にxxx:https://github.comを削除しよう。次回のgit-pull時に再びusername/passwordが尋ねられるはずだ。

vscode上において

vscodeで、Git-Credential-Manager-for-Windowsを使ったら、vscodeのgithub拡張機能が、vscodeのログインを求めてくる。平時、シングルアカウント運用をしている時は両方同じアカウントなので気にしないがこういうときはややこしい。
別にvscodeに認証情報を登録しなければgitコマンドが使えないわけでも、登録すれば使えるようになるわけでもない。これはvscodeがマルチデバイスで設定値動機をするとかLiveShareするときに使うってだけで、git credentialの動作には影響しない。

vscodeのにわたす認証情報と、Git-Credential-Manager-for-Windowsの(少なくとも)namespaceで管理する認証情報は、全く別物と割り切ろう。(たとえ設定値が同じでも)

  • default account: いつも使うアカウント。vscodeにわたす。namespaceを指定しないで使う。
  • sub account1: サブアカウント1。vscodeには渡さない。namespace "sub1"を指定して使う。
  • sub account2

というような運用が良いだろう。
subの方をvscodeにわたす人も居ると思うのでそれもいいだろう。
ただしvscodeはシングルアカウント前提の設計らしい(出典)ので注意。