假设alice是一个 github.com 用户,拥有 2 个或更多私有存储库repoN。对于这个例子,我们将只使用两个名为repo1和repo2
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
[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 个密钥。您将有更多的密钥需要处理,但如果其中一个被泄露,您将不会那么容易受到攻击。