文章

github多账号管理

问题

当我们有多个github账户时,我们提交代码会遇到权限错误

1
2
ERROR: Permission to xxx/xxx.github.io.git denied to xxx.
fatal: Could not read from remote repository.

要解决这个问题,我们需要让当前仓库知道该用哪个ssh-key来提交代码

做法

1. 本地给每个账号生成一个对应的公钥

1
2
ssh-keygen -t rsa -C "账户1的github邮箱"
ssh-keygen -t rsa -C "账户2的github邮箱"

❗️在生成时不要无脑下一步,不然后面生成的公钥会覆盖前面生成的,遇到此条提示一定要给不同的公钥分配不同的名字
Enter file in which to save the key (/Users/xxx/.ssh/id_rsa): path/to/your/id_rsa_acount1_github
Enter file in which to save the key (/Users/xxx/.ssh/id_rsa): path/to/your/id_rsa_acount2_github
Tips: 文件名自己定义一个好记的名字即可,最好和github账号有所关联,便于管理

2. 将两个公钥加入ssh-agent中

1
2
ssh-add path/to/your/id_rsa_acount1_github
ssh-add path/to/your/id_rsa_acount2_github

3. 给不同的公钥配置不同的Host

用你最顺手的编辑器打开~/.ssh/config

如果文件不存在,就自己创建一个

然后将下面内容放进去

1
2
3
4
5
6
7
8
9
User            git
Host            acount1.github.com
HostName        github.com
IdentityFile    path/to/your/id_rsa_acount1_github

User            git
Host            acount2.github.com
HostName        github.com
IdentityFile    path/to/your/id_rsa_acount2_github

4. 在github.com添加自己的ssh-key

将每个ssh-key的公钥(也就是后缀为.pub文件中的内容)添加到对应的github的账户ssh配置github多账号管理20240316213307 上传ssh公钥

5. 配置当前项目的remote链接

1
2
3
4
# 如果是新仓库
git remote add origin git@acount1.github.com:xxx/xxx.git
# 如果是老仓库
git remote set-url origin git@acount2.github.com:xxx/xxx.git

🌰 举个栗子:

原本的仓库remote地址为:git@github.com:xxx/xxx.git

如果需要账户1提交,则将其改为:git@acount1.github.com:xxx/xxx.git

如果需要账户2提交,则将其改为:git@acount2.github.com:xxx/xxx.git

🎉 然后就可以以对应账户的ssh与github进行验证,顺利提交代码啦

原理

仔细观察~/.ssh/config,并结合使用方式,我们不难发现

  • User 指的是对接远程仓库的用户名是什么,对于github来讲,一般都是git
  • Host 相当于我们自己给远程仓库的域名起了个小名
  • HostName 我们的小名原本应该叫什么
  • IdentityFile 当我们叫小名时,ssh应该去找哪一个公钥

第5步,其实就是把仓库链接里的大名(github.com)改成了小名(acount1.github.com)

当我们提交时,ssh可以通过小名(acount1.github.com)找到他的大名(github.com),所以我们改了链接之后其实依然提交到了大名(github.com)里,并不会造成异常

而不同的小名映射到了不同的ssh-key上

这样,就实现用指定账户的ssh-key提交代码了

本文由作者按照 CC BY 4.0 进行授权