在 Mac 上管理多个 GitHub 账号

动机 

我有两个 GitHub 账号,希望一个是面向工作,另一个则是私人的。那么,如何在一台 Mac 上无缝切换这个两个账号呢?本文列出了关键步骤。其他操作系统应当类似。

生成 SSH 密钥 

GitHub 提供了两种方式与远程仓库建立联系:SSH 和 HTTPS。简单来说,当我们向远程仓库 push 代码时,HTTPS 每次都需要提供所谓的 access token(当然这个活其实也只是第一次 push 的时候需要,因为 Mac 会把这个 token 存放在钥匙串里面,以后就不需要手动输入了),而 SSH 使用一对公钥和私钥取得认证(事先生成,然后本地和远程分别拿着私钥和公钥),不需要记住用户名和 token。就我们的目的而言,只能用 SSH 来实现。

假设我们有两个账号,personal 和 work,以下我们分别为它们生成 SSH 密钥。更多账号操作也是一样的。

cd ~/.ssh
ssh-keygen -t rsa -C "email@personal.com" -f "gh-personal"
ssh-keygen -t rsa -C "email@work.com" -f "gh-work"

运行完了之后,在 .ssh 文件夹下我们得到了四个文件:

  • gh-personal
  • gh-personal.pub
  • gh-work
  • gh-work.pub

其中带 .pub 扩展名的是存公钥的,不带的是存私钥的。

分配私钥和公钥 

将私钥加入 SSH Agent 

上一步只是生成了密钥,还需要把私钥加入 Mac 的钥匙串 (keychain),也就是保存密码。

ssh-add --apple-use-keychain ~/.ssh/gh-personal
ssh-add --apple-use-keychain ~/.ssh/gh-work

选项 --apple-use-keychain 就明确声明使用 Mac 的钥匙串系统存放密钥。

我们可以用以下命令来查看私钥是否被添加到了 SSH Agent:

ssh-add -l

将公钥加入 GitHub 

然后,我们把公钥加入到对应的 GitHub 账户里去。

对账户 personal,进入 “Settings”➡️“SSH and GPG keys”,然后点击 “New SSH key”,进入一个界面,“Title” 可以随便填写,只要在 “Key” 的框里边粘贴 gh-personal.pub 文件的内容就行了,以下是用命令复制文件内容的高级做法:

pbcopy < ~/.ssh/gh-personal.pub

我们对另一个账户 work 进行同样的操作,只不过是要复制对应文件 gh-work.pub 的内容。不再赘述。

配置 SSH 主机 

这一步要做的是,告诉 Mac 远程仓库的主机和本地的私钥如何对应。这通过配置 SSH Config 文件实现。

首先,打开 config 文件:

open ~/.ssh/config

然后,填入如下设定

# Your Personal GitHub Account
Host github.com-personal
    HostName github.com
    User git
    IdentityFile ~/.ssh/gh-personal

# Your Work GitHub Account
Host github.com-work
    HostName github.com
    User git
    IdentityFile ~/.ssh/gh-work

到此为止,我们的所有准备工作就完成了。下面我们看在不同的账号间具体是怎么切换的。


在不同的账号间切换 

假设我们实现已经全局设定了 work 账号是默认的 GitHub 账号:

git config --global user.name "work"
git config --global user.email "email@work.com"

但如果要建立一个 personal 账号下的仓库,在 git init 之后,就得不带 --global 选项:

git config user.name "personal"
git config user.email "email@personal.com"

要把这个仓库关联到远程仓库 myrepo,运行:

git remote add origin git@github.com-personal:personal/myrepo.git

这里面需要注意,我们用的是 SSH 的链接,而不是 HTTPS 的链接,另外我们明确指定了主机名为 github.com-personal,而不是 GitHub 仓库页面给出的 github.com

这样就可以对 myrepo 进行 push 等操作了。

如果有另外的仓库是注册在 work 账号下的,不需要再特别进行 git config,因前面我们已经全局指定了,但在 git clone work 账号下的私有仓库和关联远程仓库时,仍然要注意指定主机名为 github.com-work

以上(完)。

参考 


最后修改于 2024-08-28