子模块是私有Github存储库时git子模块的问题

时间:2012-05-17 00:45:25

标签: git ssh github amazon-ec2 git-submodules

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

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

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

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

如果我手动检查这些私有存储库它是否有效,但是在使用git submodule命令时却没有。任何的想法?这不完全支持吗?

1 个答案:

答案 0 :(得分: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将每个存储库视为生活在不同的服务器上,并传入一个显式的身份文件,因此不会混淆使用什么密钥。