【问题标题】:Problems with git submodules when submodules are private Github repos当子模块是私有 Github 存储库时 git 子模块的问题
【发布时间】:2012-05-24 14:35:35
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 是的,我想这么多,但是,部署密钥是唯一的,我不能将它们放置在多个项目中。我会看看我还能做些什么,但我主要只是想要无密码部署。
    • 这并不奇怪;这很标准!标准解决方案正是您所建议的。
    • @Len,尽管它可能是标准的,但它很奇怪。 github 应该修复他们的东西以允许在多个 repos 上使用相同的部署密钥:)
    • @bdonlan:我仍然认为这并不奇怪;-)。我猜部署密钥背后的“哲学”是您可以撤销一个并确切知道哪个回购被撤销。 (顺便说一句,OT,但你是 bdonlan.livejournal.com 吗?)
    • @Len,这很奇怪,因为这意味着我需要在下载配置之前配置一些东西 (~/.ssh/config)。撤销实际上应该有两种方式 - 拒绝主机 X 访问 repo Y,或者从主机 X 撤销密钥 Z。从 repo Y 撤销密钥 Z 变得笨拙。而且 bdonlan.livejournal.com 已经六年没有更新了 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多