动机
我有两个 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