我在两种情况下使用git:
首先,我使用ssh-keygen
生成在OpenShift站点更新的密钥。此类密钥存储在~/.ssh/
并创建 id_rsa
和 id_rsa.pub
。
然后我开始从Github克隆一个存储库,我曾经再次ssh-keygen
并开始推送,它工作正常。然后我克隆了另一个存储库并开始遇到问题:
克隆到第二个存储库时出现问题。每次我尝试推送都会显示如下内容:
ERROR: Permission to diegoaguilar/cursoJava.git denied to diegoaguilar/cursoCannibalCreatures. fatal: The remote end hung up unexpectedly
但是可以看出 diegoaguilar/cursoCannibalCreatures
不正确,因为它是 另一个 存储库。
我甚至尝试删除这样的存储库目录,并再次克隆它,同样的事情发生了。
我已经遇到~/.ssh
:
config
:
Host cursoJava
Hostname github.com
User git
IdentityFile ~/.ssh/id_java
Host cursoCannibalCreatures
Hostname github.com
User git
IdentityFile ~/.ssh/id_cannibal
Host openshift
Hostname openshift.com
User git
IdentityFile ~/.ssh/openshift
所以得到了:
id_cannibal id_cannibal.pub id_java id_java.pub known_hosts
id_openshift
和id_openshift.pub
之类的东西不存在,但由于它不起作用,我现在不在乎。
我创建了这样的文件,它们是.pub
ssh-keygen -f <filename>
,并为每个文件提供了不同的密码短语。我在每个Github存储库设置中添加了.pub
的内容作为部署密钥。
我做错了什么?这应该怎么样?并且,当在另一台机器上工作时,如何正确获取这些密钥,证明它是我并透明地工作?
git remote -v
的输出:
origin git@github.com:diegoaguilar/cursoJava.git (fetch)
origin git@github.com:diegoaguilar/cursoJava.git (push)
origin git@github.com:diegoaguilar/cursoCannibalCreatures.git (fetch)
origin git@github.com:diegoaguilar/cursoCannibalCreatures.git (push)
答案 0 :(得分:41)
如“ssh,github,it doesnot work”中所述,诀窍是不使用public:private键的默认id_rsa(.pub)名称(因为你只能定义一个几个那些),但不同的名字。
但是,只有当您以不同的用户身份访问
时才会这样做在您的情况下,您使用相同的用户访问回购商,而一个ssh密钥就足够了。
请参阅“GitHub help”:
此错误表示您推送的密钥作为部署密钥附加到另一个存储库,并且无权访问您尝试推送到的存储库。
要解决此问题,请从存储库中删除部署密钥,然后 attach the key to your user account instead 。
这是为两个不同的用户使用GitHub。
然后定义一个~/.ssh/config
文件,在其中以完整路径引用每个私钥:
Host github1
HostName github.com
User git
IdentityFile ~/.ssh/id_repo1
Host github2
HostName github.com
User git
IdentityFile ~/.ssh/id_repo2
不使用git@gihub.com:user/repo1
,而是使用:
github1:user/repo1
使用密钥Host
条目“github1
”来引用用户(git
),主机名(github.com
)以及要使用的确切私钥/公钥{ {1}}
因此,如果您有第二个使用存储为~/.ssh/id_repo1(.pub)
的第二个密钥的回购,则需要使用上面定义的条目“~/.ssh/id_repo2(.pub)
”(您可以根据需要命名),然后更改您的原始网址:
github2
这样,git remote set-url origin github2:user/repo2
将使用正确的密钥(git push
的
如果不这样做,您将可以推送一个回购(使用默认密钥repo2
,默认名称),但您将无法推送到第二个回购,这需要一个不同的公钥/私钥。