LoginSignup
18
15

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-07-03

状況 (仮定)

  • いろいろな経緯で 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 みたいに)
18
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
15