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