可能是一个简单的问题,但我在这里不知所措......
在 github 中,可以为每个存储库添加一个部署密钥,它只允许访问该单个存储库。
但是对于一个客户,我在同一台服务器上使用 git 管理了两个项目(项目 A 和项目 B)。如果我使用项目 A 的公钥,github 告诉我不能将它用作项目 B 的部署密钥,反之亦然。
如何创建另一个公钥并设置 git 以将一个密钥用于项目 A,另一个用于项目 B?
可能是一个简单的问题,但我在这里不知所措......
在 github 中,可以为每个存储库添加一个部署密钥,它只允许访问该单个存储库。
但是对于一个客户,我在同一台服务器上使用 git 管理了两个项目(项目 A 和项目 B)。如果我使用项目 A 的公钥,github 告诉我不能将它用作项目 B 的部署密钥,反之亦然。
如何创建另一个公钥并设置 git 以将一个密钥用于项目 A,另一个用于项目 B?
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
or b.github.com:user/project-b.git
(或类似的)作为您的存储库 URL。
假设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 keys 配置中,但现在您需要处理 ssh 问题。
github.com
如果存储库托管在同一个域上,ssh 如何判断使用哪个密钥?您的.ssh/config
文件指向github.com
并且它不知道在进行拉取时使用哪个键。
所以我在 github.com 上找到了一个窍门。您可以告诉您的 ssh 客户端,每个存储库都位于不同的 github.com 子域中,在这些情况下,它们将是repo1.github.com
并且repo2.github.com
所以第一件事是编辑.git/config
你的 repo 克隆上的文件,所以它们看起来像这样:
对于 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 个密钥。您将有更多的密钥需要处理,但如果其中一个被泄露,您将不会那么容易受到攻击。