はじめに
会社のGitHubアカウントと個人のGitHubアカウントを併用したい場面はよくあります。この記事では、個人リポジトリを clone しようとして Repository not found エラーに遭遇したところから、SSH鍵をアカウントごとに使い分ける設定までをまとめます。
発端:Repository not found エラー
個人のリポジトリを clone しようとしたら、次のエラーが出ました。
$ git clone git@github.com:test-user/sample-repo.git
Cloning into 'sample-repo'...
ERROR: Repository not found.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
このエラーの意味
Repository not found は、SSH経由でアクセスしたものの GitHub 側が「そのリポジトリは見つからない」と判断したことを示します。原因は主に3つです。
-
リポジトリ名・所有者名のタイプミス、またはまだ作成されていない
ブラウザでhttps://github.com/test-user/sample-repoを開き、実在するか確認する。 -
権限の問題
そのリポジトリがプライベートで、いま認証されているアカウントにアクセス権がない場合、GitHub はセキュリティ上の理由から「存在しない」と返します。 -
SSH鍵の問題
ローカルの鍵が GitHub に登録されていない、または意図しないアカウントの鍵で接続している。
今回の状況がまさに3番目でした。普段は会社アカウントの鍵で接続されており、その鍵では個人リポジトリにアクセスできないため Repository not found になっていたのです。
いま自分がどのアカウントとして認証されているかは、次のコマンドで確認できます。
ssh -T git@github.com
# Hi <ユーザー名>! You've successfully authenticated...
ここに表示されるユーザー名が想定と違えば、鍵の問題が濃厚です。
解決:アカウントごとにSSH鍵を使い分ける
個人用と会社用で別々の鍵を用意し、SSHのホスト設定で振り分けます。
1. 個人用のSSH鍵を作成する
会社の鍵と衝突しないよう、ファイル名を分けて作成します。
ssh-keygen -t ed25519 -C "test@example.com" -f ~/.ssh/id_ed25519_personal
~/.ssh/id_ed25519_personal(秘密鍵)と ~/.ssh/id_ed25519_personal.pub(公開鍵)ができます。
-Cのあとの文字列は鍵に付ける**コメント(ラベル)**で、接続動作には影響しません。慣習的にその鍵を使うアカウントのメールアドレスを入れ、後から見分けやすくします。"personal-github"のような任意の文字列でも構いません。
2. 公開鍵を個人のGitHubアカウントに登録する
cat ~/.ssh/id_ed25519_personal.pub
表示された内容をコピーし、個人アカウントの Settings → SSH and GPG keys → New SSH key に貼り付けます。
3. ~/.ssh/config でホストごとに鍵を振り分ける
# 個人用(別ホスト名として定義)
Host github-personal
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_personal
IdentitiesOnly yes
ポイントは Host github-personal という実在しない別名を定義していること。実際の接続先は HostName github.com で本物に向けつつ、この別名で来たときだけ個人用の鍵を使わせます。
会社用(
Host github.com)のブロックは必須?
会社用の鍵が~/.ssh/id_ed25519のような標準的な名前で一つだけ置いてあるなら、Host github.comを明示的に書かなくても、SSHがデフォルトの鍵を自動で試すため今まで通り接続できます。個人用のブロックだけ追加すれば十分です。
ただし標準名の鍵が複数あって意図しない鍵が先に試される恐れがある場合は、Host github.comも明示しIdentitiesOnly yesを指定したほうが確実です。
4. clone は個人用のホスト名を使う
git clone git@github-personal:test-user/sample-repo.git
github.com ではなく github-personal を使うことで、設定した個人用の鍵が使われます。
5. 接続確認
ssh -T git@github-personal
# Hi test-user! You've successfully authenticated...
仕組みの理解:「リポジトリごと」ではなく「URLのホスト名ごと」
「リポジトリごとに鍵を分けている」と捉えがちですが、正確には次の流れです。
- clone 時の URL に書かれたホスト名(
github.comかgithub-personalか)が、そのリポジトリの.git/configに保存される - 以後そのリポジトリで
git push/git pullするたびに、保存されたホスト名に対応する鍵が自動的に使われる - 別のリポジトリで違うホスト名で clone すれば、そちらは別の鍵が使われる
つまり Git がリポジトリを区別しているのではなく、各リポジトリの remote URL に書かれたホスト名を介して間接的に鍵が紐づいている、という理解が正確です。
既存リポジトリの鍵を後から切り替える
すでに会社用の鍵で clone してしまったリポジトリも、remote URL のホスト名を書き換えれば切り替えられます。
# 現在の remote URL を確認
git remote -v
# 会社用 → 個人用に変更
git remote set-url origin git@github-personal:test-user/sample-repo.git
clone 時に固定されるわけではなく、git remote set-url でいつでも変更できます。「clone はそのURLを設定する最初のタイミング」というだけです。
まとめ
-
Repository not foundは、存在しない/権限がない/意図しないアカウントの鍵で接続しているのいずれか。 - 個人用の鍵を別名(
Host github-personal)に紐づけ、URL のホスト名で使い分ける。 - 鍵を決めているのはリポジトリではなく remote URL のホスト名。
git remote set-urlで後から変更可能。
複数アカウントを併用するなら、最初に clone するときにどちらのホスト名を使うかだけ意識すれば、あとは自動で正しい鍵が使われます。