13

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

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

我能够克隆主存储库,因为它可以识别 SSH 密钥。当我运行“git submodule update”时,它在私有存储库上失败,并出现以下错误:

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

如果我手动签出那些私有仓库,它可以工作,但在使用 git submodule 命令时不行。任何想法?这不是完全支持吗?

4

1 回答 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 将每个存储库视为位于不同的服务器上,并传入显式身份文件,因此不会混淆使用什么密钥。

于 2012-05-17T06:17:28.773 回答