同一服务器上多个代码仓库的Git设置

26

这可能是一个简单的问题,但我很困惑...

Github上每个存储库都可以添加部署密钥,该密钥仅授予对该存储库的访问权限。

但是,我有一个客户,在同一服务器上管理两个使用git的项目(项目A和项目B)。如果我使用项目A的公钥,则github告诉我无法将其用作项目B的部署密钥,反之亦然。

如何创建另一个公钥,并设置git使用一个密钥来处理项目A,使用另一个密钥来处理项目B?

2个回答

49

使用~/.ssh/configssh方法,创建主机名别名并使用不同的主机名访问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(或类似的)作为您的存储库URL。


非常感谢,听起来不错!这意味着我将再次使用a.github.com/b.github.com的URL在客户服务器上克隆我的项目存储库,并在此之前将公钥作为存储库密钥存储在我的GitHub帐户中,对吗?我会尽快尝试一下。 - Max
2
如果您已经有它们,我认为您不需要再克隆它们 - 您可以使用 "git remote" 更改远程存储库的URL。 - Paŭlo Ebermann
那个完全按照你描述的方式运行了。太好了!非常感谢! - Max
2
这个解决方法对我有效,谢谢。但是为什么GitHub一开始就有这个限制呢?有人知道吗? - Garrett Albright
这个解决方法对我在同一服务器上使用多个不同的部署密钥和多个代码库非常有效。谢谢! - Arda

4
假设alice是一个github.com用户,拥有2个或多个私人存储库repoN。在本例中,我们只使用名为repo1repo2的两个存储库。 https://github.com/alice/repo1 https://github.com/alice/repo2 您需要从这些存储库中拉取内容,而不需要在服务器上或多个服务器上输入密码。例如,您想要执行git pull origin master,并且希望它在不要求输入密码的情况下完成。
如果您不喜欢处理ssh代理,您可能已经发现了有关~/.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 的url修改为类似这样的内容:

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

最后,您进入代码库的“设置 > 部署密钥”部分,添加了“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)
现在,您需要将新的公钥放入github.com上的“repo2”的部署密钥配置中,但现在您需要处理一个ssh问题。
如果存储库托管在同一“github.com”域上,那么ssh如何知道要使用哪个密钥?
您的“.ssh/config”文件指向“github.com”,当进行拉取操作时,它不知道要使用哪个密钥。
因此,我发现了关于github.com的技巧。您可以告诉ssh客户端每个存储库都位于不同的github.com子域中,在这些情况下,它们将是“repo1.github.com”和“repo2.github.com”。
所以第一件事是编辑存储库克隆上的“.git/config”文件,使其如下所示:
对于repo1:
[remote "origin"]
        url = "ssh://git@repo1.github.com/alice/repo1.git"

对于repo2

[remote "origin"] 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个密钥。这样,您将有更多的密钥要处理,但如果一个密钥被攻破,您就不那么容易受到影响了。


1
我认为你的答案很棒。但是它的表达方式非常令人困惑。你可能需要进行编辑。 - snegi

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