Featured image of post 不用修改 URL,轻松管理多个 GitHub 账号的 SSH Keys

不用修改 URL,轻松管理多个 GitHub 账号的 SSH Keys

配图: brown wooden book shelves with books photo – Free Image on Unsplash

当有多个 Github 账号时,就会遇到一个问题,怎么让不同的账号用不同的 SSH key 去认证呢?

当去查相关的资料时,一般的方法都是这样的

1
2
3
4
5
6
7
8
Host user1-github
    HostName github.com
    User git
    IdentityFile ~/.ssh/user1_rsa
Host user2-github
    HostName github.com
    User git
    IdentityFile ~/.ssh/user2_rsa

在 .ssh/config 中自定义两个 Host,然后在使用 GitHub 仓库时,将 URL 中的 host 替换一下,比如

1
2
3
4
5
git clone [email protected]:username1/project.git

换成

git clone [email protected]:username1/project.git

这样就完成了,不过,这样每次 clone 前要手动改一下 URL,不太方便的样子,能不能不改 URL?可以,但是要有一个约定

今天再次查这个问题时,看到一个方法,链接在这里,https://stackoverflow.com/a/61150726 ,然后恍然大悟,原来可以这么玩,怎么玩呢?看代码

1
2
3
4
5
Match host github.com exec "[ $(git config user.email) = [email protected] ]"
    IdentityFile ~/.ssh/perso_rsa

Host github.com
    IdentityFile ~/.ssh/pro_rsa

原来在 ssh config 中,可以执行命令的!那玩法可就多了。这个 Match 判断是怎么执行的呢?如果 exec 中的命令返回 0(一般的命令正常结束就是 0,异常就是非 0)就视为 match,所以这里就用到刚刚提到的约定,只要把约定转换成命令即可。

例子中,他是约定了另一个账号的仓库必须配置为一个特定的 email,我呢,搞了另外一个约定,最后配置如下

1
2
3
4
5
Match Host github.com !exec "pwd | grep '/ahhhhh/' > /dev/null"
  IdentityFile ~/.ssh/key1

Match Host github.com exec "pwd | grep '/ahhhhh/' > /dev/null"
  IdentityFile ~/.ssh/key2

我把另一个账号的仓库放到 /ahhhhh/ 下,这样当在 /ahhhhh/ 下操作时,ssh 就会自动使用 key2 进行鉴权,就不用修改 URL 了,自动切换 ssh key。

另个一个小问题是,keys 是可以自动切换了,但是 user.name 和 user.email 还是全局只有一份,在另一个账号下提交时,还是会用全局的,想要用本账号的要手动设置,这个也可以通过配置自动解决

在全局的 .gitconfig 中,添加如下部分

1
2
[includeIf "gitdir:/ahhhhh/"]
  path = ~/.gitconfig-company

注:这个会导致 Xcode 的 Swift Package Manger 功能不能正常工作 https://stackoverflow.com/questions/60857372/xcode-11-couldnt-communicate-with-a-helper-application-when-attempting-to/61049144#61049144

然后新建一份配置,.gitconfig-company,内容如下:

1
2
3
[user]
  email = [email protected]
  name = ahhhhh

这样如果在 /ahhhhh/ 下操作,.gitconfig-company 中定义的字段就会覆盖掉全局的配置,自动切换 user.email 和 user.name 的目的就达到了。

总的来说,通过两个配置,达到了在约定目录下统一使用指定账号信息的目的,不用再担心用错账号,不用再手动修改 URL 了。

参考资料

Licensed under CC BY-NC-SA 4.0
Built with Hugo
Theme Stack designed by Jimmy