1台のパソコンで複数のGitアカウントを切り替えて使う設定(SSH接続)


自分メモです('ω')

複数Gitアカウントを使い分けたい事情があり、パソコンに設定した時のメモになります。またパソコン変える時の備忘用に。

設定前の困った状況と対応方針

httpsトークンでの認証だと、どうしても端末のメインブラウザのCredentialに引っ張られてしまい上手く行かない。(私の場合はEdgeのMicrosoftアカウントのサインインに引っ張られる)せめて使用するCredentialを選ばせてくれたら良いのに。

トークンアクセスを拒否しパスワードアクセス(Basic認証)したら、すぐにGitHubから「もうBasic認証使えなくなるから、早くトークンアクセスに切り替えてね」なんてメールが来ちゃいました('ω')

そこで、GitHubではトークンアクセス推奨なのは承知の上で、SSH接続を試してみました。実施したことは以下の通り。

  • メインアカウント/サブアカウント用のSSH鍵の生成、GitHubへのSSH公開鍵登録
  • /.ssh/configを作成・編集し、接続先に応じてユーザー名とSSH秘密鍵を使い分け
  • アカウント切り替えのシェルを作成(リモートリポジトリ、user.name、user.emailを切り替え)

リモートリポジトリのURL指定の違い

まず、GitHubのリモートURLはここから確認できます。

↓こんな感じです。ハイパーリンクになってしまうので、「~」入れてます。

  • HTTPS URL:https~/github.com/アカウント/リポジトリ名
  • SSH URL:git@~github.com:アカウント/リポジトリ名

SSH接続用のSSH鍵生成と公開鍵登録

こちらは以下記事が分かり易くまとまっているので、これを参考に作業します。

SSH接続の使い分け

まずはSSHの接続使い分けからです。(/.ssh/config)
ポイントは、実際の接続先となるHostNameは「github.com」で同一ですが、シェル内でホスト指定の使い分けができるよう、別名で登録してあげることです。名前は何でもOKです。

/.ssh/config
Host github.com.main
  HostName github.com
  User usernameA
  Port 22
  IdentityFile ~/.ssh/id_rsa_main
  TCPKeepAlive yes
  IdentitiesOnly yes
Host github.com.sub
  HostName github.com
  User usernameB
  Port 22
  IdentityFile ~/.ssh/id_rsa_sub
  TCPKeepAlive yes
  IdentitiesOnly yes

Gitアカウントを切り替えるシェルの作成

続いてはGitアカウントを切り替えるシェルです。(/.bashrc)
これで、git configのuser.nameuser.emailremote.origin.urlを書き換えています。関数名は分かり易ければ何でも。

/.bashrc
function gitMain() {
  git config --global user.name "usernameA"
  git config --global user.email emailAddressA
  git remote remove origin
  git remote add origin [email protected]:usernameA/repository-name.git
  git config --list
}
function gitSub() {
  git config --global user.name "usernameB"
  git config --global user.email emailAddressB
  git remote remove origin
  git remote add origin [email protected]:usernameB/repository-name.git
  git config --list
}

これで、GitMainGitSubを打つたびに参照するリモートリポジトリの切り替えができるようになります。私は不安なので、必ずgit config --listで変更された環境を確認するようにしていますが、ここは無くても問題ないです。

終わりに

毎回作業している環境を意識しながら、切り替えながらの作業になりますので、人によっては面倒かもしれません。私的にはむしろブラックボックスにしてしまうとすぐ忘れてしまいそうなので、これくらいでちょうど良いです。

もっと高度なやり方をされている例も色々ありそうですが・・、それはその内。
こちらの記事、大いに参考にさせて頂きました。