😕

複数のGithubを切り替えて利用する方法

2024/12/21に公開

はじめに

こんにちは、本業はフロントエンジニアとして活動しています。
Github アカウントを会社用と個人用で分けて使っているのですが、それぞれ切り替えて使おうとした際にプライベートリポジトリを clone しようとして詰まったので、それの解決策について解説しようと思います。

この記事の対象者

会社と個人 Github アカウントを分けており、同一 PC 内でアカウントを分けて使いたい方

Case1. デフォルトではないアカウントのプライベートリポジトリが Clone できない

複数の Github アカウントを切り替えてプライベートリポジトリを clone する方法について解説します。

前提として、会社 Github アカウントがデフォルトの接続設定であるとします。

~/.ssh/config
# 会社Githubアカウント
Host github.com
  HostName github.com
  User git
  Port 22
  IdentityFile ~/.ssh/xxx
  TCPKeepAlive yes
  IdentitiesOnly yes

通常、以下のようにすれば会社アカウントで作ったリポジトリを clone したり、pull したりすることができます。

git clone git@github.com:【アカウント名】/【リポジトリ名】.git

ですが、Github アカウントを別で分けて使おうとした場合において、個人用アカウントのプライベートリポジトリを clone しようとすると失敗してしまいます。
これを解決するためには、以下のように config ファイルの会社 と 個人用の 接続設定を分けて別名で保存する必要があります。

~/.ssh/config
# 会社Githubアカウント
Host github.com
  HostName github.com
  User git
  Port 22
  IdentityFile ~/.ssh/xxx
  TCPKeepAlive yes
  IdentitiesOnly yes

# 個人用Githubアカウント
Host github.com.private
  HostName github.com
  User git
  Port 22
  IdentityFile ~/.ssh/yyy
  TCPKeepAlive yes
  IdentitiesOnly yes

会社アカウントの場合はそのままでよく、個人用のプライベートリポジトリの場合、以下のように Host 名を指定してやることで clone することができるようになります。
明示的に Host 名を変えることで個人用のアカウントの接続設定を切り替えることできたので、clone できたというわけです。

git clone git@github.com.private:【アカウント名】/【リポジトリ名】.git

Case2. 新規プロジェクトをデフォルトではないアカウントのリポジトリに Push できない

別なケースとして、プロジェクトを新規に作成しようとした際にデフォルトではないアカウントでリモートリポジトリを登録して Push したらエラーとなるパターンです。
通常、Github のリポジトリを PC のプロジェクトに紐付けようとする際は、以下のようにすると思います。

git remote add origin git@github.com:【アカウント名】/【リポジトリ名】.git

エラーが起きる理由としては、Github のリポジトリ画面上でコピーする「git@github.com」の部分が基本的に同じだからそのまま実行してしまうとデフォルトの設定となってしまうために発生してしまうというわけです。

ですので、こちらも Case1 と同様にリモートリポジトリを登録する際に Host 名を明示的に指定してやる必要があります。
最初に誤って登録したリモートリポジトリ設定を削除して、改めて別アカウントの Host 名を指定して登録してやります。

git remote remove origin
git remote add origin git@github.com.private:【アカウント名】/【リポジトリ名】.git

これで登録でき、Push もできるようになるはずです。

おわりに

Github アカウントが同一 PC 内にあり、分けて使うというケースが正直あまりないが故に今回のような問題が発生します。
よくよく考えたら簡単な問題ですが、初心者だと意外とハマる問題かと思います。

同じような問題に遭遇した方の助けになれば幸いです。

Discussion