Git添加多个SSH密钥以及远程仓库


使用过GitHub的小伙伴们都知道,GitHub创建私有仓库是收费的,对于一些不能公开的代码是没有办法在GitHub上进行备份的。
这里我推介一个国内的代码托管网站——码云,它是一款国内的基于Git的研发协作平台,它是免费创建私有仓库的。操作基本与GitHub类似,对于使用GitHub的朋友上手起来非常容易。
这里我们在同一台电脑上同时添加GitHub和码云的仓库地址,私有的push到码云上,开源的push到GitHub上。

我们直接进入正题:

Git添加多个SSH密钥

有时候我们可能会在同一台电脑上使用多个SSH密钥,这里就会遇到权限问题。
如果你已经有了一套名为id_rsa的公秘钥,将要生成另外一个公钥,比如mayun,你也可以使用任何你喜欢的名字。

生成新密钥

打开你的GitBash键入:

$ ssh-keygen -t rsa -C "email@email.com" -f ~/.ssh/mayun

回车后,生成命名的公钥和生成默认公钥的步骤一样,全部跳过就行。
执行完成后,会在 ~/.ssh/目录下生成一个mayunmayun.pub文件。

配置SSH中的config文件

~/.ssh的路径下会有一个config文件,没有的自己新建一个。
编辑config文件:

Host 别名
HostName 主机名
User 用户名
IdentityFile 路径

例如:
Host git@github.com
HostName https://github.com
User Passion-Logan
IdentityFile C:/Users/Cody_/.ssh/id_rsa

Host mayun
HostName https://gitee.com/
User 八阿哥
IdentityFile C:/Users/Cody_/.ssh/mayun

添加新密钥到另一个地址中

上面我们生成了一个名为mayun的密钥,这里我们添加到码云的用户设置中,
具体操作参照我上一篇文章中的配置Github账户的ssh key就好。

验证ssh权限

在GitBash中依次键入:

$ ssh -T git@github.com
$ ssh -T git@gitee.com

如果出现如下提示,则说明有权限问题:
$ Permission denied (publickey)

多用户出现权限问题的原因

github使用SSH与客户端连接。如果是单用户(first),生成密钥对后,将公钥保存至GitHub,每次连接时SSH客户端发送本地私钥(默认~/.ssh/id_rsa)到服务端验证。单用户情况下,连接的服务器上保存的公钥和发送的私钥自然是配对的。但是如果是多用户 (first,second),我们在连接到second的帐号时,second保存的是自己的公钥,但是SSH客户端依然发送默认私钥,即first的私钥,那么这个验证自然无法通过。

SSH密钥权限设置

1、查看系统ssh-key代理,如果出现Could not open a connection to your authentication agent. 可以执行ssh-agent bash 命令后再执行下面的操作:

$ ssh-add -l

输出以下提示,就表示没有代理,可以执行一下命令,否则执行ssh-add -D 命令清除代理:

$ The agent has no identities.

2、依次添加不同的ssh代理

$ ssh-add ~/.ssh/id_rsa
$ ssh-add ~/.ssh/mayun

3、验证ssh key
按照上面的依次键入:

$ ssh -T git@github.com
$ ssh -T git@gitee.com

//分别会提示你在config文件中设置的User名字,没有的话就表示设置错误了。

ssh-agent讲解

ssh-agent是一种控制用来保存公钥身份验证所使用的私钥的程序
上面我们执行了ssh-agent bash 命令,是将bash挂到ssh-agent下面,只是一次性的;下次使用的时候还是需要对权限进行重新设置。

添加多个远程仓库

在我们的Git中既然有多个ssh key,那就表示有多个地址。添加步骤如下:

添加仓库地址

在GitBash中键入:

$ git remote add name <url>    //name表示你要给这个远程仓库起的名字,url表示仓库地址
例如:
$ git remote add github https://github.com/xxx(仓库地址)
$ git remote add gitee https://gitee.com/xxx(仓库地址)

push代码的正确步骤

有时候我们可能会遇到这样的错误error: src refspec master does not match any,引起这个错误的原因是目录中没有文件,空目录是不能被提交上去的。

$ touch README   //也可以在创建室友仓库的时候创建
$ git add -A    //提交所有改变的文件
$ git commit -m 'first commit'    //提交更新,并注释'first commit'
$ git push -u name master    //name是指你创建的地址的别名

如果push的时候出现To git@github.com。。。master->master。。。,这里有人说可以使用git push -u origin master 来解决,可是键入后依然没能解决这个问题,导致的原因是地址中的README文件不在本地代码目录中,解决办法如下:

$ git pull --rebase name master     //这里name是你自己地址的别名。
之后再执行push即可完成上传:
$ git push -u name master

参考文章:
《生成多个git ssh密钥》
《Git添加多个远程仓库》
《如何解决failed to push some refs to git》


文章作者: Cody_
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Cody_ !
评论
 上一篇
SpringBoot引入Thymeleaf SpringBoot引入Thymeleaf
在距离发表上一篇博文的时间整整一个月的今天,趁着放假更一篇,证明我还存在这个世界。对于一个学习Java的童鞋,怎么能忘了学习SpringBoot这个框架呢!前段时间在学习的时候添加一个JSP页面却死活找不到页面,无奈换了Thymeleaf,
2018-04-06
下一篇 
修改Hexo博客上传协议为SSH 修改Hexo博客上传协议为SSH
在使用过Hexo博客一段时间过后,它突然报了一个错误,让我摸不着头脑,错误如下: ...... FATAL bash: /dev/tty: No such device or address error: failed to execute
2018-02-26
  目录