【问题标题】:git setup for multiple repos on same server在同一台服务器上为多个 repos 设置 git
【发布时间】:2024-09-28 19:25:02
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: git ssh github public-key


    【解决方案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 首先有这个限制呢?有人知道吗?
    • 这个解决方法对我来说适用于具有多个存储库的同一服务器上的多个不同部署密钥。谢谢!