GitリポジトリサーバのSSH鍵を使い分け

自分用のメモ。

基本的には以下のページが非常に参考になる。

qiita.com

謝意を述べたい。

これに、私なりの理解や補足を加えておく。

結論

同一のリポジトリサーバ(GitHubやBitBucketのような)内を、目的やアカウントで、使用するSSH鍵を使い分けたい場合、SSHのホスト設定とGitのローカル設定を駆使すればできる。

Gitグローバル設定

まず、Gitのグローバル設定は空っぽが望ましい。Gitをインストールすると、大抵 git config --global user.email の設定を推奨されるが、アカウントの使い分けをする上では「うっかりミス」を誘発してしまう。もしEメールを使い分けるなら user.email をグローバル設定には置かないようにする。もしあるなら以下のようにする。

$ git config --global --unset user.email

SSH設定

例えば、A社用とB社用でGitHubで使うEメールアドレスやSSH鍵を使い分けなければならない場合、それぞれにSSH鍵を発行、登録していたとして、~/.ssh/configファイルに次のように設定する。

Host github_a_company
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa_github_a => これの公開鍵をA社アカウントでGitHubに登録
    IdentitiesOnly yes

Host github_b_company
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa_github _b => これの公開鍵をB社アカウントでGitHubに登録
    IdentitiesOnly yes

Gitローカル設定

あとはプロジェクトのディレクトリに移動し、Gitのローカル側設定を以下のようにする。

$ cd project_a
$ git init
$ git config user.name "My Name"
$ git config user.email myname@a.com
$ git config url.github_a_company.insteadof git@github.com
$ cd project_b
$ git init
$ git config user.name "My Name"
$ git config user.email myname@b.com
$ git config url.github_b_company.insteadof git@github.com

こうすると、例えばA社のプロジェクトでソースコードをPushすると、

$ cd project_a
$ git remote -v
origin  git@github.com:myaccount/myproject.git (fetch)
origin  git@github.com:myaccount/myproject.git (push)
$ git push origin master

Push時のホスト名は以下のように変化する。

git@github.com => github_a_company (.git/configを適用)
github_a_company => git@github.com (~/.ssh/configを適用)

?元に戻っただけ?

否!

github_a_company を適用した時点で、A社用の「SSH公開鍵」が使われるようになっている。

Gitクローン時

なお、 .git/config がまだ存在しない、例えば git clone 操作する場合はどうするか? その場合、ホスト名を ~/.ssh/config に設定した Host xxxxxx を代わりに使えばできる。

例えば、B社用のSSH鍵でsomeprojectのソースコードをクローンしたい場合は次のようにする。

$ git clone git@github_b_company:someaccout/someproject.git

あとは必要に応じてプロジェクト内でGitを初期化、ローカル設定すればいい。