假设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) keypair,然后你也去你的仓库的。git/配置文件,你修改你的远程源url如下所示:
[remote "origin"]
url = "ssh://git@github.com/alice/repo1.git"
最后,您进入存储库设置>部署密钥部分,并添加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。repo1.alice_github.id_rsa.pub id_rsa)
Repo2密钥对:(Repo2 .alice_github。repo2.alice_github.id_rsa.pub id_rsa)
现在,您将把新的公钥放在github.com上的repo2的Deploy keys配置中,但现在您有一个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中提取原始主机。
如果你有多台机器,你可以把钥匙复制到每台机器上,然后重复使用,但我建议做一些跑腿的工作,每台机器生成一个钥匙,然后回收。你将有更多的钥匙要处理,但如果其中一个被泄露,你就不会那么脆弱了。