前言
有人说这样能让读者心情愉悦地看文章🤣~
文章背景
因为自己想试着玩一下git的fork与pull request功能。所以注册了两个github账号来做实验。结果发现之前一直在用的A账号push是正常的。新注册的B账号push报错。
Pushing to https://github.com/DistributionCoderXLL/XLLTest.git
remote: Permission to DistributionCoderXLL/XLLTest.git denied to b593771943.
fatal: unable to access 'https://github.com/DistributionCoderXLL/XLLTest.git/': The requested URL returned error: 403
根据上面的报错,发现B账号DistributiionCoderXLL推送失败的原因是受限于A账号b593771943。
解决思想
使用多个SSH Key分别作为本地git仓库与GitHub远程仓库的纽带,这也是新账号不能正常push的原因所在
1. 根据每个账号邮箱对应生成SSH Keys
# 1. 打开ssh存放位置
cd ~/.ssh
# 2.对应每个github账号邮箱生成SSH Key
ssh-keygen -t rsa -C "A邮箱地址"
ssh-keygen -t rsa -C "B邮箱地址"
在这个命令下第一个会话的时候,对生成的SSH Key进行命名。如id_rsa_github_one、id_rsa_github_two
进入~/.ssh
路径下,可以看到如下几个文件:
2. 将两个私钥加入到SSH的agent中
# 1.删除原有agent中的所有私钥
ssh-add -D
# 2.对应将刚刚生成的私钥添加到agent中
ssh-add id_rsa_github_one
ssh-add id_rsa_github_two
# 3.查看添加到agent的私钥列表
ssh-add -l
3.创建映射文件config,来分别映射本地git仓库与GitHub远程仓库
#1.创建config文件
touch config
# 2.打开编辑config文件
vim config
# 3.编辑内容如下
# one(1593771943@qq.com) //第一个git账号
Host github.com //自定义host
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_github_one //对应的ssh私钥
User git
# two(m15822049431@163.com) //第二个git账号
Host small.github.com //自定义host
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_github_two //对应的ssh私钥
User git
4.远程仓库部署SSH Key
# 1.获取公钥内容
vim id_rsa_github_one.pub
打开后将文件内容全部复制到剪切板。
分别在网页上登录GitHub账号,Settings -> SSH and GPG keys -> New SSH key,将刚刚复制到剪切板公钥内容对应添加进去。
点击Add SSH key按钮,进行添加。成功后如下图:
5.测试SSH的连通性
ssh -T git@example.com example.com替换为config文件下对应的host名。
如果连通性没问题,会返回Hi xxx(你的github账号名)! You've ...。并且返回到网页上,看到刚才的钥匙变绿了。
6.重新配置每个账号下项目的远程地址
可以回头重新看一下刚刚config文件对host的配置。
- A账号设置的Host为github.com,这个是github默认的,不用管。
- B账号设置的Host为small.github.com。但是我们克隆下来的时候,远程仓库使用的是默认的github.com。所以我们需要手动更新一下这个账号下克隆的远程仓库地址。
# 1.cd到B账号下的本地代码仓库
cd /Users/xiaole/XLLIMClient
# 2.查看此仓库的远程仓库地址
git remote -v
查看的远程仓库结果如下:
origin git@github.com:DistributionCoderXLL/XLLIMClient.git (fetch)
origin git@github.com:DistributionCoderXLL/XLLIMClient.git (push)
我们看到B账号下的远程仓库还是git@github.com
。并不是我们设置的git@small.github.com
。所以我们要替换成自己定制的。
# 3.移除原远程仓库
git remote rm origin
# 4.添加自定制远程仓库
git remote add origin git@small.github.com:DistributionCoderXLL/XLLIMClient.git
大功告成
做完这一切,A,B两个账号就可以无冲突地进行代码的commit,push,merge等操作了。
如果想对这方面有所了解的话,建议大家动手操作一下。你动手做或多或少都会遇到问题。不得不对国内开发者进行一下吐槽。很多人自己都不动手操作,看着不错就对一些文章进行了转载,导致百度一大堆错误的文章,这是很不负责任的行为。