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

Posted

技术标签:

【中文标题】在同一台服务器上为多个 repos 设置 git【英文标题】:git setup for multiple repos on same server 【发布时间】:2011-07-09 18:41:06 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

假设 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 的 URL 修改为如下所示:

[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)

您现在将新的公钥放在 github.com 上的 repo2 的 Deploy keys 配置中,但现在您需要处理 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 个密钥。您将有更多的密钥需要处理,但如果其中一个被泄露,您将不会那么容易受到攻击。

【讨论】:

我觉得你的回答很好。但是它的书写方式非常混乱。您可能需要对其进行编辑。【参考方案2】:

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(或类似名称)作为您的存储库 URL。

【讨论】:

非常感谢,听起来不错!意味着我将使用 a.github.com/b.github.com url 再次在客户端服务器上克隆我的项目存储库,然后将公钥作为存储库密钥存储在我的 github 帐户中,对吗?我会尽快尝试。 我认为您不需要再次克隆它们,如果您已经拥有它们 - 您可以使用 git remote 更改远程存储库 URL。 这与您描述的完全一样。伟大的!非常感谢! 这个解决方法对我有用,谢谢。但是为什么 GitHub 首先有这个限制呢?有人知道吗? 这个解决方法对我来说适用于具有多个存储库的同一服务器上的多个不同部署密钥。谢谢!

以上是关于在同一台服务器上为多个 repos 设置 git的主要内容,如果未能解决你的问题,请参考以下文章

cocoapods 如何使用同一个 repo.git 进行多个私有 repo

Xcode5 bot 无法对 git repo 进行身份验证

Git笔记如何在同主机同账户下实现多个gitlab帐号管理各自的remote repo

Git笔记如何在同主机同账户下实现多个gitlab帐号管理各自的remote repo

markdown GIT中的多账号如何处理?1。同一台电脑多个GIT中(不同网站的)账号2.同一台电脑多个GIT中(同一个网站的比如github上的)多个账号

在单个服务器上为多个 Laravel 应用程序使用 Redis 队列