前言
有一天小猪心血来潮,觉得之前的 github 账号id (pig) 不够碎,于是注册了一个新的 github 账号 (weijiezhu) ,并且按照 github help 的套路完成了ssh的配置。因为同一个 sshkey (id_rsa) 不允许用在两个账号当中,于是他生成了一个新的 sshkey (github_rsa)。
当他写完代码觉得自己很碎的时候,git push origin master 却返回了一个错误。
$ git push origin master
ERROR: Permission to weijiezhu/react-scaffold.git denied to pig.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
于是乎他跑了一个测试
$ ssh -T git@github.com
Hi pig! You've successfully authenticated, but GitHub does not provide shell access.
wocao,怎么还是pig这个账号呢。 明明弄了新的sshkey。
经过一番捣腾,小猪仿佛发现了什么
ssh 使用了默认的 id_rsa 密钥进行加密,而这个很久以前创建的 sshkey 确实添加到 pig 账号里面了。
当访问 github.com 的时候,github 服务会认为你就是pig这个账户。
噢~那好吧。把 pig 账号里面的 sshkey 删掉吧,反正也不用了。然后把 id_rsa.pub 公钥重新添加到 weijiezhu 这个账号里面,顺便删掉添加的 github_rsa.pub 公钥。
$ pbcopy < ~/.ssh/id_rsa.pub
再次提交代码。Absolutely done!
注意:
上文和下文进阶的用户名和邮箱要配置好,如果有多个账号,建议使用局部的。
git config user.name "用户名" //在config后加上--global即全局 git config user.email "邮箱"
进阶
然而事情并没有到此结束,装完逼还想跑那是不行的。小猪日后发现自己是一个念旧的人。他想要同时使用两个github。
那好吧,What a big deal~
这个时候我们需要先找到 ~/.ssh/config 文件,然后往里面添加如下配置
Host pig.github.com
HostName github.com
IdentityFile ~/.ssh/github_rsa
我们指定 pig.github.com 这个”作用域”下的ssh连接统一指向 github.com ,并且使用之前生成好的 github_rsa 这个密钥加密。
那么默认的就是使用 ~/.ssh/id_rsa 这个密钥加密咯。 并且HostName与“作用域”相同。这个就不需要我们管了。
这个时候我们测试一下呗。
$ ssh -T git@pig.github.com
Hi pig! You've successfully authenticated, but GitHub does not provide shell access.
$ ssh -T git@github.com
Hi weijiezhu! You've successfully authenticated, but GitHub does not provide shell access.
: ) , orz , 这时候还差最后一步
就是修改一下我们在 pig 克隆下来的项目的 remote “作用域” 。
$ git remote rm origin
$ git remote add origin git@pig.github.com:pig/tinynote.git // 注意是 pig.github.com 噢?, 把这个理解为一个“作用域”吧。
$ git push origin master
Everything up-to-date
同样的,对于使用不同的git服务商,如(coding.net,gitlab等),可以“东施效颦”地使用上文的进阶方案来解决本地多个git账号的问题。
这个时候小猪的队友惊呼 ,Jesus Christ, u save my ass ! orz.
对于ssh无密码登录原理,或者.ssh/config配置不熟悉的可以自行google进行延伸阅读噢。
免责防喷: 如果上文描述哪里有问题,请不吝赐教!