状況 (仮定)
- いろいろな経緯で 2 つの GitHub アカウントを持っている。
- それぞれ異なる用途があり、どちらかに統一することができない。
- どちらにも 1 つのマシン上でアクティブに push し続けたい。
- なるべく意識せずリポジトリ単位でアカウントをスイッチしたい。
- できれば
git remote -v
で表示されるホストは GitHub 上で見えるものと同じにしたい
方針
-
~/.ssh/config
で各アカウントの別名を定義する。- うっかりとメインのアカウントで push する事故を防ぐため別名のない
github.com
は無効化する。
- うっかりとメインのアカウントで push する事故を防ぐため別名のない
- ローカルリポジトリ毎の gitconfig で
url.<alias>.insteadOf = <target>
で、上で設定した別名を参照するよう定義する。
例
ユーザ名は foo
ユーザと bar
ユーザになっているので、試したい場合には適宜自分の名前にすると良い。
foo
ユーザの秘密鍵は ~/.ssh/foo.id_rsa
、 bar
ユーザの秘密鍵は ~/.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 みたいに)