GitHubを複数アカウントで使い分けるSSH configの設定方法

git

はじめに

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_personalgithub-workで接続したときはid_rsa_workgithub-projectで接続したときはid_rsa_projectが使われます。

configファイルの権限を確認する

環境によっては、~/.ssh/configの権限が広すぎるとSSHが設定を使ってくれないことがあります。必要に応じて、次のコマンドで権限を整えます。

chmod 600 ~/.ssh/config

これは、configファイルを自分だけが読み書きできる状態にするコマンドです。

設定項目の意味

ここで、~/.ssh/configに書いた項目の意味を確認しておきましょう。

Host

Hostは、自分で決める接続名です。GitのURLを書くときや、接続確認をするときに使います。

今回の例では、github-personalgithub-workgithub-projectHost名です。

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.nameuser.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.nameuser.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つずつ設定していきましょう。

コメント

タイトルとURLをコピーしました