如何为每个git存储库管理一个唯一的密钥?

时间:2014-03-31 17:44:02

标签: git github ssh

我在两种情况下使用git:

  • 我使用了一些 Github 存储库。
  • 我目前正在使用OpenShift,它使用 ssh 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_openshiftid_openshift.pub之类的东西不存在,但由于它不起作用,我现在不在乎。

我创建了这样的文件,它们是.pub ssh-keygen -f <filename>,并为每个文件提供了不同的密码短语。我在每个Github存储库设置中添加了.pub的内容作为部署密钥。

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

修改

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)

1 个答案:

答案 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,默认名称),但您将无法推送到第二个回购,这需要一个不同的公钥/私钥。