Edited at

2 つの異なる GitHub アカウントの SSH を使い分けたい場合のやり方

More than 1 year has passed since last update.


状況 (仮定)


  • いろいろな経緯で 2 つの GitHub アカウントを持っている。


    • それぞれ異なる用途があり、どちらかに統一することができない。



  • どちらにも 1 つのマシン上でアクティブに push し続けたい。


    • なるべく意識せずリポジトリ単位でアカウントをスイッチしたい。



  • できれば git remote -v で表示されるホストは GitHub 上で見えるものと同じにしたい


方針



  • ~/.ssh/config で各アカウントの別名を定義する。


    • うっかりとメインのアカウントで push する事故を防ぐため別名のない github.com は無効化する。



  • ローカルリポジトリ毎の gitconfig で url.<alias>.insteadOf = <target> で、上で設定した別名を参照するよう定義する。


ユーザ名は foo ユーザと bar ユーザになっているので、試したい場合には適宜自分の名前にすると良い。

foo ユーザの秘密鍵は ~/.ssh/foo.id_rsabar ユーザの秘密鍵は ~/.ssh/bar.id_rsa とする。

それぞれ対応する公開鍵を GitHub のそれぞれのアカウントに登録しておく。

github.com に対しては秘密鍵を /dev/null を指定した。 (無効化したい意図)


~/.ssh/config

Host github.com

IdentityFile /dev/null

Host foo.github.com
User git
HostName github.com
IdentityFile ~/.ssh/foo.id_rsa

Host bar.github.com
User git
HostName github.com
IdentityFile ~/.ssh/bar.id_rsa



アカウントfooのリポジトリ

$ git config --add url."ssh://foo.github.com/".insteadOf 'git@github.com:'



アカウントbarのリポジトリ

$ git config --add url."ssh://bar.github.com/".insteadOf 'git@github.com:'


これらの設定はリモートリポジトリを設定した後に行うようにすれば良い。


ついでに

アカウントによってユーザ名や連絡先のメールアドレスも変えたいことは多々あると思う。 (変えないで --global で設定しているとコミット時のユーザ名が結局同じになってしまう。)

あらかじめ上のような操作をするスクリプトを用意しておけば、手間はかからなくなる。

(GPG など諸々もついでに設定してしまおう。)


~/.bin/git-config-foo

#!/usr/bin/env bash

set -eu
USERNAME='foo'
EMAIL='foo@example.com'
SSH_ALIAS='ssh://foo.github.com/'
GPG_KEY='XXXXX'

upsert_config(){
local key="$1"
local val="$2"
if git config --get "$key" >/dev/null 2>&1 ; then
git config --replace "$key" "$val"
else
git config --add "$key" "$val"
fi
}

upsert_config user.name "$USERNAME"
upsert_config user.email "$EMAIL"
upsert_config url."$SSH_ALIAS".insteadOf 'git@github.com:'

# ↓ GPG の設定が必要な場合はアンコメントアウト
# upsert_config user.signingkey "$GPG_KEY"
# upsert_config gpg.program 'gpg1'
# upsert_config commit.gpgsign true



さらに

何度もこれを実行する予定があるなら git config-foo みたいに呼べるともっと楽だ。

先ほどのスクリプトを適当なパス (自分の場合は ~/.bin/git-config-foo ) に設置して、 chmod +x で実行権限を付与し

$ git config --global alias.config-foo '!~/.bin/git-config-foo'

のようにエイリアスを設定すると良い。

そうすれば

$ git config-foo

のように実行できるようになる。



  • もちろん同じやり方で 2 つ以上も使い分けできる。

  • 同じようなやり方で Bitbucket 等なども使い分けることが可能。

  • 本来は例示につかうアカウント名は、例示に使うことが保証されたアカウントにしたかったが、分からなかった。 (example.com みたいに)