はじめに
GitHubを使っていると、個人用アカウント、仕事用アカウント、別プロジェクト用アカウントなど、複数のアカウントを1台のPCで使い分けたい場面があります。
このとき、どのGitHubアカウントにどのSSH鍵を使うのかをPC側で指定しておかないと、意図しないアカウントで接続されてしまうことがあります。
この記事では、すでにSSH鍵を作成済みで、GitHub側にも公開鍵を登録済みである前提で、~/.ssh/configを使って複数のGitHubアカウントを使い分ける方法を説明します。
この記事ではSSH鍵の作成方法やGitHubへの公開鍵登録方法は扱いません。鍵が用意できている状態から、複数アカウントを使い分ける設定に集中します。
今回の前提
この記事では、次の3つのGitHubアカウントを使い分ける例で進めます。
- 個人用アカウント:
github-personal - 仕事用アカウント:
github-work - プロジェクト用アカウント:
github-project
また、SSH鍵は次のように作成済みであるとします。
~/.ssh/id_rsa_personal
~/.ssh/id_rsa_work
~/.ssh/id_rsa_projectファイル名は自分の環境に合わせて読み替えてください。鍵の種類はid_rsaでもid_ed25519でも構いません。この記事では例として、id_rsa_personalのような名前を使っています。
大切なのは、GitHubアカウントごとに使うSSH鍵を分けることです。
複数アカウントで起きやすい問題
GitHubのSSH接続では、通常次のようなURLを使います。
git@github.com:user-name/repository-name.gitこのURLでは、接続先としてgithub.comが使われています。GitHubアカウントが1つだけなら、これでもあまり困りません。
しかし、複数のGitHubアカウントを使う場合、PC側から見ると接続先はどれも同じgithub.comです。そのため、どのSSH鍵を使えばよいのかが分かりにくくなります。
そこで、SSH configを使って、同じGitHubへの接続に別々の名前を付けます。

SSH configで接続名を分ける考え方
~/.ssh/configは、SSH接続の設定を書いておくファイルです。
このファイルにHostという接続名を作ると、実際の接続先が同じgithub.comでも、用途ごとに別の名前で接続できるようになります。
たとえば、個人用アカウントにはgithub-personal、仕事用アカウントにはgithub-workという名前を付けます。
github-personal → github.comへ、個人用のSSH鍵で接続する
github-work → github.comへ、仕事用のSSH鍵で接続する
github-project → github.comへ、プロジェクト用のSSH鍵で接続するHostに書く名前は、GitHubのアカウント名そのものではありません。自分のPCのSSH設定で使う「接続名」です。
~/.ssh/configに設定を書く
それでは、~/.ssh/configを編集します。ファイルがまだない場合は、新しく作成します。
次の内容を~/.ssh/configに書きます。
Host github-personal
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_personal
IdentitiesOnly yes
Host github-work
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_work
IdentitiesOnly yes
Host github-project
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_project
IdentitiesOnly yesこの設定により、github-personalで接続したときはid_rsa_personal、github-workで接続したときはid_rsa_work、github-projectで接続したときはid_rsa_projectが使われます。
configファイルの権限を確認する
環境によっては、~/.ssh/configの権限が広すぎるとSSHが設定を使ってくれないことがあります。必要に応じて、次のコマンドで権限を整えます。
chmod 600 ~/.ssh/configこれは、configファイルを自分だけが読み書きできる状態にするコマンドです。
設定項目の意味
ここで、~/.ssh/configに書いた項目の意味を確認しておきましょう。
Host
Hostは、自分で決める接続名です。GitのURLを書くときや、接続確認をするときに使います。
今回の例では、github-personal、github-work、github-projectがHost名です。
HostName
HostNameは、実際に接続するサーバー名です。GitHubに接続するので、ここはどの設定でもgithub.comになります。
User
Userは、SSH接続で使うユーザー名です。GitHubへSSH接続する場合は、GitHubのアカウント名ではなくgitを指定します。
IdentityFile
IdentityFileは、使う秘密鍵ファイルの場所です。アカウントごとに別の鍵を指定することで、GitHub側では別々のアカウントとして認識されます。
IdentitiesOnly
IdentitiesOnly yesは、IdentityFileで指定した鍵を優先して使うための設定です。
PCに複数のSSH鍵がある場合、意図しない鍵が試されて接続に失敗することがあります。この設定を書いておくと、どの鍵を使うのかが分かりやすくなります。
ssh -Tで接続を確認する
設定を書いたら、ssh -Tで接続確認をします。
個人用アカウントの接続を確認するには、次のように実行します。
ssh -T git@github-personal仕事用とプロジェクト用も同じように確認します。
ssh -T git@github-work
ssh -T git@github-project~/.ssh/configにはUser gitを書いているため、ssh -T github-personalの形でも確認できます。ただし、GitHubのSSH URLと対応させて考えやすいように、この記事ではgit@Host名の形で説明しています。
接続に成功すると、次のようなメッセージが表示されます。
Hi user-name! You've successfully authenticated, but GitHub does not provide shell access.user-nameの部分に、接続できたGitHubアカウント名が表示されます。ここが想定しているアカウントになっているか確認してください。
ここで接続に失敗する場合は、~/.ssh/configの設定だけでなく、対応する公開鍵がGitHub側に登録されているかも確認してください。
shell accessという文字が出ても、GitHubでは正常な表示です。GitHubに認証できているけれど、通常のサーバーのようなシェル操作はできない、という意味です。
cloneするときはHost名を使う
SSH configでHost名を作ったら、GitのURLでもそのHost名を使います。
通常のSSH URLは次のような形です。
git@github.com:user-name/repository-name.git複数アカウントを使い分ける場合は、github.comの部分を、SSH configで作ったHost名に置き換えます。
git@github-personal:user-name/repository-name.gitたとえば、仕事用アカウントでリポジトリをcloneしたい場合は、次のようになります。
git clone git@github-work:work-user/sample-repository.gitこのように書くことで、Gitはgithub-workの設定を見に行き、id_rsa_workを使ってGitHubへ接続します。

既存リポジトリのremote URLを変更する
すでにclone済みのリポジトリでは、remote URLがgithub.comのままになっていることがあります。
まず、対象のリポジトリのフォルダに移動し、現在のremote URLを確認します。
git remote -v次のように表示された場合、接続先はgithub.comになっています。
origin git@github.com:work-user/sample-repository.git (fetch)
origin git@github.com:work-user/sample-repository.git (push)仕事用アカウントの設定を使いたい場合は、次のようにremote URLを変更します。
git remote set-url origin git@github-work:work-user/sample-repository.git変更できたか、もう一度確認します。
git remote -v次のようにgithub-workが表示されていれば、remote URLの変更は完了です。
origin git@github-work:work-user/sample-repository.git (fetch)
origin git@github-work:work-user/sample-repository.git (push)リポジトリごとにuser.nameとuser.emailを設定する
SSH configは、GitHubへ接続するときに使うSSH鍵を切り替えるための設定です。
一方で、コミットに記録される名前やメールアドレスは、Gitのuser.nameとuser.emailで決まります。SSH接続が正しくても、Gitのユーザー情報が別アカウントのままになっていることがあります。
リポジトリごとに設定するには、対象のリポジトリのフォルダで次のように実行します。
git config user.name "Work User"
git config user.email "work@example.com"設定できたか確認するには、次のコマンドを実行します。
git config user.name
git config user.emailこの設定は、今いるリポジトリだけに適用されます。個人用リポジトリでは個人用の名前とメールアドレス、仕事用リポジトリでは仕事用の名前とメールアドレス、というように分けておくと管理しやすくなります。
SSH接続に使うアカウントと、コミットに記録されるuser.emailは別の設定です。複数アカウント運用では、両方を確認しましょう。
よくあるミスと確認ポイント
remote URLがgithub.comのままになっている
~/.ssh/configを書いても、Gitのremote URLがgit@github.com:...のままだと、作成したHost名が使われません。
git remote -vで確認し、必要に応じてgit remote set-urlで変更してください。
ssh -Tで別のアカウント名が表示される
ssh -T git@github-workを実行したのに個人用アカウント名が表示される場合は、IdentityFileで指定している鍵が間違っている可能性があります。
GitHub側に登録した公開鍵と、PC側の秘密鍵の組み合わせが合っているか確認しましょう。
Permission deniedが表示される
Permission denied (publickey)のようなエラーが出る場合は、SSH鍵が正しく使われていないか、対応する公開鍵がGitHub側に登録されていない可能性があります。
IdentityFileのファイル名、GitHub側の公開鍵登録、remote URLで使っているHost名を順番に確認しましょう。
コミットのメールアドレスが違う
SSH接続とGitのユーザー情報は別の設定です。接続できていても、コミットのメールアドレスはgit config user.emailで確認する必要があります。
アカウントごとにメールアドレスを分けたい場合は、リポジトリごとにuser.nameとuser.emailを設定しておきましょう。
まとめ
今回は、1台のPCで複数のGitHubアカウントを使い分けるために、~/.ssh/configを設定する方法を確認しました。
Hostで接続名を分けるIdentityFileでアカウントごとのSSH鍵を指定するssh -T git@Host名で想定したGitHubアカウントに接続できるか確認する- cloneやremote URLでは
github.comではなく、設定したHost名を使う - コミットの名前とメールアドレスは、リポジトリごとの
git configで確認する
複数アカウントの使い分けでは、「接続に使うSSH鍵」と「コミットに記録されるユーザー情報」を分けて考えることが大切です。まずはssh -T git@Host名とgit remote -vを確認しながら、1つずつ設定していきましょう。

コメント