假设alice
是一个github.com用户,拥有两个或更多的私有存储库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"
最后,您需要进入存储库的“设置>部署密钥”部分,并添加“alice_github.id_rsa.pub”的内容。这样,您就可以毫无问题地执行“git pull origin master”,而无需输入密码。
但第二个存储库怎么办?
因此,您的直觉是获取该密钥并将其添加到repo2的“部署密钥”中,但是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的“部署密钥配置”中,但现在您面临SSH问题。
如果存储库托管在同一github.com域上,那么SSH如何知道要使用哪个密钥?
您的.ssh / config文件指向github.com,当执行拉操作时,它不知道要使用哪个密钥。
因此,我发现了一个github.com的技巧。您可以告诉您的SSH客户端每个存储库位于不同的github.com子域中,在这些情况下,它们将是repo1.github.com和repo2.github.com。
因此,第一件事是编辑存储库克隆的.git / config文件,以便它们看起来像这样:
[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个密钥。虽然您需要处理更多的密钥,但如果其中一个密钥被泄露,您将不太容易受到攻击。
git pull
一直失败并要求输入学校密码,尽管已经有了单独的身份文件、“IdentitiesOnly=yes”、不同的域名和主机名,所有这些都在ssh-add -l
中存在……无论如何,uni密钥始终是“第一个”。必须将其部分移到.ssh/config中的其他部分下面,现在从两个GitHub账户进行git pull
成功而不需要请求uni ssh密码。 - mc01sshCommand
git 配置选项,检查下面的答案。 - marcelocra