25

可能是一个简单的问题,但我在这里不知所措......

在 github 中,可以为每个存储库添加一个部署密钥,它只允许访问该单个存储库。

但是对于一个客户,我在同一台服务器上使用 git 管理了两个项目(项目 A 和项目 B)。如果我使用项目 A 的公钥,github 告诉我不能将它用作项目 B 的部署密钥,反之亦然。

如何创建另一个公钥并设置 git 以将一个密钥用于项目 A,另一个用于项目 B?

4

2 回答 2

48

ssh这样做的方法是使用~/.ssh/config,创建一个主机名别名并为两个项目使用不同的主机名访问 github。我不知道是否也有git config(或git remote)方式。

Host a.github.com
HostName github.com
User git
IdentityFile ~/.ssh/project-a-id_rsa

Host b.github.com
HostName github.com
User git
IdentityFile ~/.ssh/project-b-id_rsa

然后使用a.github.com:user/project-a.gitor b.github.com:user/project-b.git(或类似的)作为您的存储库 URL。

于 2011-03-06T13:33:54.840 回答
2

假设alice是一个 github.com 用户,拥有 2 个或更多私有存储库repoN。对于这个例子,我们将只使用两个名为repo1repo2

https://github.com/alice/repo1

https://github.com/alice/repo2

您需要从这些存储库中提取而无需在服务器或多台服务器上输入密码。例如,您想要执行git pull origin master,并且您希望在不要求密码的情况下发生这种情况。

您不喜欢与 ssh-agent 打交道,您已经发现(或者您现在正在发现)~/.ssh/config一个文件,该文件让您的 ssh 客户端根据主机名和用户名知道要使用的私钥,并带有一个看起来像这样的简单配置条目这个:

Host github.com
  HostName github.com
  User git
  IdentityFile /home/alice/.ssh/alice_github.id_rsa
  IdentitiesOnly yes

所以你继续创建你的(alice_github.id_rsa, alice_github.id_rsa.pub)密钥对,然后你也去你的存储库的.git/config文件,你修改了你的遥控器的 url 是origin这样的:

[remote "origin"]
        url = "ssh://git@github.com/alice/repo1.git"

最后你去了存储库Settings > Deploy keys部分并添加了alice_github.id_rsa.pub

此时,您可以在git pull origin master不输入密码的情况下毫无问题地进行操作。

但是第二个存储库呢?

因此,您的直觉是获取该密钥并将其添加到repo2的 Deploy 密钥中,但 github.com 会出错并告诉您该密钥已被使用。

现在你去生成另一个密钥(ssh-keygen -t rsa -C "alice@alice.com"当然使用没有密码),这样就不会变得一团糟,你现在将这样命名你的密钥:

  • repo1密钥对:(repo1.alice_github.id_rsa, repo1.alice_github.id_rsa.pub)
  • repo2密钥对:(repo2.alice_github.id_rsa, repo2.alice_github.id_rsa.pub)

您现在将新的公钥放在repo2github.com 的 Deploy keys 配置中,但现在您需要处理 ssh 问题。

github.com如果存储库托管在同一个域上,ssh 如何判断使用哪个密钥?

您的.ssh/config文件指向github.com并且它不知道在进行拉取时使用哪个键。

所以我在 github.com 上找到了一个窍门。您可以告诉您的 ssh 客户端,每个存储库都位于不同的 github.com 子域中,在这些情况下,它们将是repo1.github.com并且repo2.github.com

所以第一件事是编辑.git/config你的 repo 克隆上的文件,所以它们看起来像这样:

对于 repo1

[remote "origin"]
        url = "ssh://git@repo1.github.com/alice/repo1.git"

对于 repo2

[远程“来源”] url =“ssh://git@repo2.github.com/alice/repo2.git”

然后,在您的.ssh/config文件中,现在您将能够为每个子域输入配置:)

Host repo1.github.com
  HostName github.com
  User git
  IdentityFile /home/alice/.ssh/repo1.alice_github.id_rsa
  IdentitiesOnly yes

Host repo2.github.com
  HostName github.com
  User git
  IdentityFile /home/alice/.ssh/repo2.alice_github.id_rsa
  IdentitiesOnly yes

现在,您git pull origin master无需从两个存储库中输入任何密码即可。

如果您有多台机器,您可以将密钥复制到每台机器并重复使用它们,但我建议您做一些工作以在每台机器和存储库中生成 1 个密钥。您将有更多的密钥需要处理,但如果其中一个被泄露,您将不会那么容易受到攻击。

于 2014-10-22T12:38:43.243 回答