可能是一个简单的问题,但我在这里不知所措......
在github中,可以为每个存储库添加部署密钥,只能访问该单个存储库。
但是对于一个客户端,我在同一台服务器上使用git管理了两个项目(项目A和项目B)。如果我使用项目A的公钥,github告诉我,我不能将它用作项目B的部署密钥,反之亦然。
如何创建另一个公钥并设置git以将一个键用于项目A而另一个用于项目B?
答案 0 :(得分:41)
执行此操作的ssh
方法是使用~/.ssh/config
,创建主机名别名并访问具有两个项目的不同主机名的github。我不知道是否还有git config
(或git remote
)方式。
Host a.github.com
HostName github.com
User git
IdentityFile ~/.ssh/project-a-id_rsa
Host b.github.com
HostName github.com
User git
IdentityFile ~/.ssh/project-b-id_rsa
然后使用a.github.com:user/project-a.git
或b.github.com:user/project-b.git
(或类似)作为您的存储库网址。
答案 1 :(得分:2)
假设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
的网址是这样的:< / p>
[remote "origin"]
url = "ssh://git@github.com/alice/repo1.git"
最后,您访问了存储库Settings > Deploy keys
部分,并添加了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)
现在,您将把新的公钥放在repo2
的部署密钥配置github.com上,但现在您有一个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个钥匙和回购。您将拥有更多要处理的密钥,但如果受到攻击,您将不那么容易受到攻击。