假设 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 文件,并将远程 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.com 和 repo2.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 个密钥。您将有更多的密钥需要处理,但如果其中一个被泄露,您将不会那么容易受到攻击。