@peccul is peccu

(love peccu '(emacs lisp cat outdoor bicycle mac linux coffee))

複数プロジェクトのGitリポジトリでSSH公開鍵をよしなに切り替える

tl;dr

~/.ssh/config にホスト名のエイリアスを書いて

Host github-project1
  HostName github.com
  IdentityFile ~/.ssh/project1/id_rsa-project1

~/.gitconfig にURLの読み替え設定をすれば

[url "ssh://git@github-project1/"]
  insteadOf = git@github.com:project1/

SSH用のURLで普通に git clone できるはず

$ git clone git@github.com:project1/some-cool-repo.git
Cloning into 'some-cool-repo' ...
remote: Enumerating objects: xxx, done.
remote: Counting objects: 100% (xxx/xxx), done.
remote: Compressing objects: 100% (xxx/xxx), done.
remote: Total xxx (delta xxx), reused xxx (delta xxx), pack-reused xxx
Receiving objects: 100% (xxx/xxx), xx MiB | xx MiB/s, done.
Resolving deltas: 100% (xxx/xxx), done.

背景とか

プロジェクト毎にユーザや環境が違ってSSHキーも入れ替えるのが面倒だったので。

もともと https のURLを SSHのURLに書き換える(逆も)ために使えるのは知っていたがリポジトリのオーナー指定までできるか試したらうまくいった。 [url "ssh://.../"] の方は最後の / も必要。

ついでに、設定ファイルも分離してincludeさせるとなんかいい感じ。

  • SSHの設定分離

~/.ssh/config

# Host の設定などより前に書く必要ある。変なエラーが出たり設定が反映されずよくわからないはまり方をする

Include "project1/config"

# other configs
Host xxx
    Hostname xxxx
...

~/.ssh/project1/config

Host github-project1
  HostName github.com
  IdentityFile ~/.ssh/project1/id_rsa-project1

これでSSHのカギと設定をフォルダにまとめられる

  • Gitの設定分離

Gitの設定もフォルダに分けるとよいかもしれないけれど、そこまで利点がないかも。 dotfilesをGit管理していて、プロジェクト固有の情報を入れたくないときくらいかな。

~/.gitconfig

...

[include]
    path = .gitconfig_project1

~/.gitconfig_project1

[url "ssh://git@github-project1/"]
  insteadOf = git@github.com:project1/