環境構築からWEBアプリ開発・スマホアプリ開発まで。ときには動画制作やゲームも。

supilog
すぴろぐ

複数のGithubにSSH公開鍵認証でpushしたい

複数のGithubにSSH公開鍵認証でpushしたい

背景

仕事寄りとプライベート寄りとか、別のグループ向けに別途アカウントを用意したりなど、複数のGithubアカウントを使い分けたい方が、少なからずいると思います。

httpsで扱う方法も手段としてはありますが、pushの際にパスワードを入力したりと面倒です。

一方、公開鍵はアカウントの主を担保するものであり、一意である必要があると思われるので、片方のアカウントに登録した公開鍵をもう一方のアカウントに登録することはできません。(登録しようとするとエラーになるはずです)

となると

アカウントAの公開鍵・秘密鍵のセットアカウントBの公開鍵・秘密鍵のセットを用意することになります。

例えば、リモートサーバーにSSHログインする場合には、下記のように秘密鍵を指定して使い分けることができますよね。

ssh IPアドレス -i ~/.ssh/id_rsa

git pushする際に、これと似たようなことをするにはどうすれば良いのか。

GIT_SSH_COMMANDを使う

GIT_SSH_COMMAND='ssh -i ~/.ssh/id_rsa_supilog' git push origin main

と鍵を指定することができます。これが利用できるのは、gitのバージョンが2.3からのようです。

どうしてもバージョンを上げられない場合は、次に紹介するGIT_SSHを利用する方法があります。

GIT_SSHを使う

# git-ssh.shファイルを作成
$ vi /tmp/git-ssh.sh
---------
#!/bin/sh
exec ssh -i ~/.ssh/id_rsa_supilog "$@"
---------

# 実行権限
$ chmod 744 /tmp/git-ssh.sh
GIT_SSH=/tmp/git-ssh.sh git push origin main

これでpushすることができます。

~/.ssh/configを使う

上にあげた2つの方法は個人的には好みではありません。普通にgitコマンドが打てないからです。GIT_SSHにおいては、アカウント毎にシェルを作成するなんて・・・不本意ですw

ということで、~/.ssh/configを修正することに抵抗がなければ、おすすめです。(configは修正したくないという方もおられますので、そこはおまかせです

Host github.com.private
	HostName github.com
	User git
	Port 22
	IdentityFile ~/.ssh/id_rsa_private
	TCPKeepAlive yes
	IdentitiesOnly yes

Host github.com.supilog
	HostName github.com
	User git
	Port 22
	IdentityFile ~/.ssh/id_rsa_supilog
	TCPKeepAlive yes
	IdentitiesOnly yes

このように、~/.ssh/configに使用したい秘密鍵を指定してかき分けておきます。

Hostで記載した「github.com.private」「github.com.supilog」を使い分けることで、問題を解決します。

新規にリポジトリを作成する場合

新規にリポジトリを作成する場合、概ね以下のような作業を行うと思います。

echo "# git_test" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M main
git remote add origin git@github.com:supilog/git_test.git
git push -u origin main

問題となるのは、remote add の部分ですが、このままではせっかくconfigに記述した意味がありませんので、ホストの部分を書き換えます。

# git@github.com ---> git@github.com.supilog (~/.ssh/configで設定したHost)

git remote add origin git@github.com.supilog:supilog/git_test.git

こうすることで、設定上はgithub.comにアクセスされますし、指定したSSH秘密鍵が使用されるので、今後はpushの度に鍵を指定する必要はないです。

既存リポジトリをcloneして作業する場合

新規の場合には、remoteの接続先として自分の指定したいホストを設定しました。一方、既存リポジトリをcloneする場合には、clone時に指定してしまえば問題ありません。

git clone git@github.com.supilog:supilog/git_test.git

clone済みの既存リポジトリに対して接続ホストを変更したい場合

すでにclone済みのリポジトリに関しては、リモートURLのホストが「github.com」になってしまっていると思います。このままでは指定したい秘密鍵は当然ながら適用されません。

いやcloneし直してよ。と思っちゃいますが、環境構築などの問題で絶対やりたくない場合は、変更する手はあります。

# 現在のリモートURLを確認
git remote -v
-----
origin	git@github.com:supilog/git_test.git (fetch)
origin	git@github.com:supilog/git_test.git (push)
-----

# 新しいリモートURLに変更
git remote set-url origin git@github.com.supilog:supilog/git_test.git

# 変更後のリモートURLを確認
git remote -v
-----
origin	git@github.com.supilog:supilog/git_test.git (fetch)
origin	git@github.com.supilog:supilog/git_test.git (push)
-----

まとめ

どの手段をとるにせよ、gitリポジトリの操作は危険がつきまといますので、大事なリポジトリであればあるほど、テスト用のリポジトリなどで十分にテストを実施した上で、作業を行ってください!