如何为每个Git仓库管理仅有一个密钥?

45

我在两种情况下使用git:

  • 我使用一些Github存储库。
  • 我目前正在使用OpenShift,它使用sshgit进行部署。

首先,我使用ssh-keygen生成一个密钥,然后在OpenShift网站上更新。这样的密钥存储在〜/ .ssh / 中并创建了id_rsaid_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_openshiftid_openshift.pub 的文件并不存在,但由于它们无法工作,我现在不太在意。

我使用 ssh-keygen -f <filename> 命令创建了这些文件,并为每个文件设置了不同的密码。我将 .pub 文件的内容添加为每个 Github 仓库设置中的部署密钥。

我做错了什么?这应该如何工作?当在另一台机器上工作时,如何正确获取这些密钥,证明是我,并透明地工作?

编辑

git remote -v 命令的输出:

  • 对于 cursoJava 仓库

origin git@github.com:diegoaguilar/cursoJava.git (fetch) origin git@github.com:diegoaguilar/cursoJava.git (push)

  • 对于 cursoCannibalCreatures 仓库

origin git@github.com:diegoaguilar/cursoCannibalCreatures.git (fetch) origin git@github.com:diegoaguilar/cursoCannibalCreatures.git (push)


你的公共SSH密钥是否在GitHub仓库管理页面正确注册到了相应的GitHub仓库中? - VonC
是的,它们是。我进行了双重检查。我添加了我尝试过的所有内容,@VonC - diegoaguilar
你能复制 git remote -vgit branch -avvv 的结果,以及你正在输入的确切的 git push 命令和它的确切输出吗? - VonC
好的,请稍等几分钟。 - diegoaguilar
您能否稍微扩展一下您的回答?我将非常感激您。 - diegoaguilar
显示剩余5条评论
1个回答

105

如在“ssh,github,it doesnot work”中所提到的,关键是不要使用默认的id_rsa(.pub)名称作为您的公共:私有密钥(因为您只能定义一对这样的密钥),而应该使用不同的名称。

但是,仅当您使用不同的用户访问这些存储库时才需要这样做。

在您的情况下,您正在使用相同的用户访问这些存储库,一个ssh密钥应该足够了。

请参阅“GitHub帮助”:

这个错误意味着您正在推送的密钥附加到另一个仓库作为部署密钥,并且无法访问您试图推送到的仓库。

要解决此问题,请从仓库中删除部署密钥,并将密钥附加到您的用户帐户上


这是为两个不同用户使用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)和要使用的确切公钥/私钥(~/.ssh/id_repo1(.pub))。


因此,如果您有第二个仓库,它使用作为~/.ssh/id_repo2(.pub)存储的第二个密钥,则需要使用上面定义的名称为'github2'(可以任意命名),然后更改您用于origin的url:

git remote set-url origin github2:user/repo2

这样一来,git push 将使用正确的密钥(用于 repo2 的那个)。

如果你不这样做,你将只能为一个仓库推送代码(使用默认密钥 ~/.ssh/id_rsa(.pub) 和默认名称),但是你将无法推送到第二个仓库,因为它需要不同的公私钥组合。


它在我得到的另一个Github文件夹中运行良好,但在我遇到问题的文件夹中却无法正常工作。当我尝试git push时,出现相同的错误。 - diegoaguilar
在这种情况下,两个存储库都属于同一用户,这将如何更改配置文件以及git remote命令? - diegoaguilar
谢谢,顺便说一下,我现在遇到了一个关于SAME repo的问题...我试图推送并得到以下错误信息:Agent admitted failure to sign using the key. ERROR: Repository not found. fatal: The remote end hung up unexpectedly我尝试使用ssh-add,但它总是说密码不正确(实际上是正确的)。 - diegoaguilar
1
@Noitidart 是的,你可以将 GIT_SSH_COMMAND 设置为 ssh -v。然后再次尝试 git clone。你会有一些日志可以查看。 - VonC
1
@Noitidart 你可以通过配置进行相同的调试:https://dev59.com/PGsz5IYBdhLWcg3wn5RP#38474400 - VonC
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接