git设置在同一台服务器上的多个repos

时间:2011-03-06 11:49:28

标签: git ssh github public-key

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

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

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

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

2 个答案:

答案 0 :(得分:41)

执行此操作的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.gitb.github.com:user/project-b.git(或类似)作为您的存储库网址。

答案 1 :(得分: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文件,你修改了你的远程origin的网址是这样的:< / p>

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

最后,您访问了存储库Settings > Deploy keys部分,并添加了alice_github.id_rsa.pub

的内容

此时,您可以在不输入密码的情况下执行git pull origin master

但是第二个存储库呢?

所以你的直觉是获取该密钥并将其添加到repo2的部署密钥,但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)

现在,您将把新的公钥放在repo2的部署密钥配置github.com上,但现在您有一个ssh问题需要处理。

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

您的.ssh/config文件指向github.com,并且在知道拉动时它不知道要使用哪个密钥。

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

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

对于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个钥匙和回购。您将拥有更多要处理的密钥,但如果受到攻击,您将不那么容易受到攻击。