私有Github仓库作为子模块时出现的git子模块问题

14

我在Github上有一个私有仓库,其中包含3个子模块,这3个子模块也都是私有的。

我在我的EC2服务器上生成了4个SSH密钥,并将它们应用为Github部署密钥到所有4个私有仓库。

我能够克隆主仓库,因为它识别了SSH密钥。当我运行"git submodule update"时,它在私有仓库上失败并显示以下错误:

错误:找不到存储库。 致命错误:远程端意外挂断

如果我手动检查这些私有仓库,则可以工作,但在使用git submodule命令时却不行。有什么想法吗?这不是完全支持吗?

1个回答

11

GitHub的身份验证有点奇怪。他们不使用用户名;他们仅根据您提交的公钥推断出您是哪个用户。由于您生成了四个部署密钥,当您的服务器连接到GitHub时,使用哪个密钥是任意的 - GitHub将接受其中任何一个,然后拒绝访问未注册该密钥的存储库。

因此,最简单的解决方案是为所有存储库使用单个部署密钥。

如果您无法这样做,可以通过使用SSH主机别名来进行操作。在服务器的~/.ssh/config中添加以下段落:

Host repo-foo
  HostName  ssh.github.com
  Port 443
  User git
  IdentityFile /path/to/my-ssh-key-file-for-foo
  IdentitiesOnly yes

Host repo-bar
  HostName ssh.github.com
  Port 443
  User git
  IdentityFile /path/to/my-ssh-key-file-for-bar
  IdentitiesOnly yes

然后将您的子模块指向repo-bar:username/bar.gitrepo-foo:username/foo.git,而不是使用git@github.com:...形式。

这将使git和ssh有效地将每个存储库视为位于不同的服务器上,并传入明确的身份文件,以便不会混淆要使用哪个密钥。


1
是的,我也猜到了,但是部署密钥是唯一的,我不能在多个项目之间共享它们。我会看看还能做什么,但我主要是想实现无需密码的部署。 - Miles Johnson
1
这并不奇怪,这是相当标准的!标准解决方案正是你所建议的。 - Asherah
@Len, 尽管它很标准,但确实很奇怪。GitHub 应该修复他们的问题,以允许在多个存储库上使用相同的部署密钥 :) - bdonlan
@bdonlan:我仍然认为这并不奇怪;-)。我猜部署密钥背后的“哲学”是,您可以撤销一个密钥,并确切地知道正在被撤销的存储库。(顺便说一句,OT,但你是bdonlan.livejournal.com吗?) - Asherah
@Len,这很奇怪,因为这意味着我需要在下载我的配置之前配置一些东西(~/.ssh/config)。吊销应该是双向的 - 拒绝主机X访问存储库Y,或从主机X吊销密钥Z。从存储库Y中吊销密钥Z变得笨拙。而且bdonlan.livejournal.com已经六年没有更新了 :) - bdonlan
@bdonlan:是的,我知道你的意思;它有点笨重。无论如何,我想我认出了你的名字!当年我在使用 LiveJournal 时,你和我是共同的朋友 - Asherah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接