准备在Github上创建一个新的仓库,用来记录平时的代码等相关积累。
通过查阅资料,使用Android Studio创建了一个新的仓库,但是在提交代码的时候,出现了如下错误:
22:53:28.874: git -c core.quotepath=false push --progress --porcelain origin refs/heads/master:master --set-upstream
java.io.IOException: There was a problem while connecting to github.com:22
at com.trilead.ssh2.Connection.connect(Connection.java:791)
at com.trilead.ssh2.Connection.connect(Connection.java:577)
at org.jetbrains.git4idea.ssh.SSHMain.start(SSHMain.java:172)
at org.jetbrains.git4idea.ssh.SSHMain.main(SSHMain.java:138)
Caused by: java.io.IOException: Key exchange was not finished, connection is closed.
at com.trilead.ssh2.transport.KexManager.getOrWaitForConnectionInfo(KexManager.java:92)
at com.trilead.ssh2.transport.TransportManager.getConnectionInfo(TransportManager.java:230)
at com.trilead.ssh2.Connection.connect(Connection.java:743)
... 3 more
Caused by: java.io.IOException: Cannot negotiate, proposals do not match.
at com.trilead.ssh2.transport.KexManager.handleMessage(KexManager.java:413)
at com.trilead.ssh2.transport.TransportManager.receiveLoop(TransportManager.java:754)
at com.trilead.ssh2.transport.TransportManager$1.run(TransportManager.java:469)
at java.lang.Thread.run(Thread.java:745)
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
通过经验推断,跟SSH鉴权失败有关,同时,发现在Android studio的偏好设置中的Git选项内,勾选了SSH选项,如下:
这时,考虑将在GitHub上来添加SSH Key。进入GitHub->Settings,如下:
这时,可以找到添加入口。由于电脑本地已经配置过一个ssh key,使用的是公司项目的账号与邮箱,为了避免混淆,需要重新生成一个Key。ssh-keygen的指令不需要赘述,但是要注意,在创建的时候,需要重新命名你的新key的存储文件名,不能使用默认的,因为如果原来的key使用的默认的文件名(id_rsa),则会覆盖。
我给单独的github的key文件单独增加了一个后缀,用以区别默认的key文件名。接下来,需要将该key添加到ssh-agent中,使用ssh-add命令。
OK,到此已经重新创建了一个GitHub的SSH Key。那么将此key添加到GitHub账号设置页面中去,按照页面入口即可完成。重新Push代码后发现,错误依旧。考虑到目前同时存在两个Key,这里参考了一篇博客:点击打开链接,讲解了如何处理多个SSH Key对应不同Git主机的情况。在.ssh路径下,如果没有就创建一个名为config的文件,单独给GitHub的SSH来配置,如下:
HostName是对应的主机名,User是主机用户名,而Github仓库路径-ssh://git@github.com:username/XXX.git中前面的git@github.com可以被替换成Host所表示的名字,所以Host名字自定义。
保存config文件并退出。继续在Studio上尝试Push,发现推送成功!另外注意,所有本地Git仓库中的git config对应的user.name和user.email不要配置成全局的,不然会产生影响,导致所有仓库都乱套。