gitコマンドで複数のGitHubアカウントを使い分ける


環境

Mac OS
(Linuxでも動く気がします)


※ 2019/3/29追記

GitHubの利用規約にて1個人で複数の無料アカウントを運用する事は禁止されているようでした。
https://help.github.com/en/posts/github-terms-of-service#b-account-terms

もし複数の無料アカウントを利用している場合はアカウントの統合などを検討した方が良いです。
無料アカウントと有料アカウントを使い分ける場合などは本手順を参考にして貰えればと思います。

概要

GitHubではアカウントに秘密鍵が紐づいており
git コマンドを実行した際に指定した秘密鍵で利用アカウントを判定しています。
(秘密鍵未指定の場合はデフォルトの秘密鍵)

フリーランスをしていると自分のGitHubアカウントとは別で
取引先様のGitHubアカウントを作成する必要があったりするのですが
1台のPCで複数GitHubアカウントを使っていると秘密鍵の切り替えが面倒です。

私も最初はこちらの記事のように.ssh/configに別ホストとして設定していたのですが
これだとcloneする時などにいちいちホスト名を書き換えたりしなければいけなかったりして
それも少し面倒でした。(特にリポジトリが沢山あるプロジェクトだったので)
https://qiita.com/yamataku29/items/4744c9c70ad793c83b82

というわけで
リポジトリ所有者(ユーザーもしくはOrganizations)と秘密鍵の紐づけを設定しておけば
自動でgitコマンド実行時に秘密鍵を使い分けてくれるスクリプトを作りました。

こちらです
https://github.com/mildjester/gits


使い方

①cloneでもZIPダウンロードでも良いので上記リポジトリをダウンロードしてきます。

config_templateを同ディレクトリにconfigという名前でコピーします。

③コピーして生成したconfigの以下変数を設定します
■defaultKey
デフォルトの秘密鍵へのパス。基本的にテンプレートのままでいいはず。

■specialKeys
デフォルト以外の秘密鍵を使うリポジトリ所有者と秘密鍵の紐付け一覧。
形式は『リポジトリ所有者::秘密鍵のパス』なので
例えば「所有者AAA」のリポジトリに使う秘密鍵は~/.ssh/id_rsa_1
「所有者BBB」のリポジトリに使う秘密鍵は~/.ssh/id_rsa_2とする場合は
以下のようになります。

specialKeys=(  
    'AAA::~/.ssh/id_rsa_1'  
    'BBB::~/.ssh/id_rsa_2'  
)  

~/.bashrcに以下のエイリアスを追記しておきます。
通常使っているシェルがbash以外(zshやfishなど)の場合は、そちらの設定ファイルへ追記してください。

# gitコマンドを置き換える  
alias git="/path-to-gits-repository/gits.sh"  

※path-to-gits-repositoryはリポジトリをcloneまたはダウンロードしてきたディレクトリを指定してください

これで何も考えずにgitコマンドを打っても、裏で勝手に秘密鍵を切り替えてくれるようになります。

備考:ghqを使っている場合

私はgit cloneよりもghq getをよく使うので、そのスクリプトも用意しました。
基本的な設定は上記と同じで、エイリアスの設定だけ追加します。

alias ghq_get="~/git/github.com/mildjester/gits/ghq_get.sh"  

こちらは完全にコマンドを置き換える訳ではないのですが
以下のコマンドでリポジトリを取得する事ができるようになります。
(ghqとgetの間がスペースではなくアンダーバーになるだけ)

ghq_get git@github.com:AAAA/hogehoge.git