Git 无法访问子模块

Git Submodule not reachable

我有一个 git 存储库,其中有一个子模块。这个 git 存储库也在一个单独的环境中镜像。但是,子模块 git 存储库未镜像。这两个环境不能互相交谈。为了解释问题,假设 ENV1 有子模块 (bar) 和 git repo (foo)。 ENV2 是 git 存储库 (foo) 的镜像,bar 子模块未镜像到 ENV2

我遇到的问题是在 ENV2 中,尽管存在 bar 目录...它是空的。这是因为 ENV2 无法与 ENV1 交谈。有什么办法可以解决这个问题吗?我的目标是在 ENV1 中仅 提交代码。我是否也应该将 bar 子模块放在 ENV2 上并开始镜像它?如果是这样,子模块 URL 将如何根据环境变化。含义:

ENV1我做:

git submodule add git@env1:group/bar.git

我是否必须为 ENV2 明确添加不同的 URL,例如

git submodule add git@env2:group/bar.git

一个子模块是一个 url+一个 SHA1 引用。

您的镜像将镜像 SHA1 引用(一个 gitlink,父 Git 存储库中的特殊条目,已镜像)

但是由于子模块回购本身没有镜像...父回购可以引用在(非镜像)图像栏子模块回购中不存在的 SHA1。 (或者如果 bar 在镜像环境中根本不存在,那么对于任何 SHA1 来说它都是空的)

镜像父存储库必须能够引用可访问且最新的 bar 存储库。

与其尝试在本地更改它,不如检查像 url.<base>.insteadOf 这样的配置是否有效:目标是使用 git@env2 而不是 git@env1,但不更改 git@env1 位于 .gitmodules.

A clone --recursiveclone 后跟 git submodule update --init 将填充 bar 子模块。


作为变通方法,在 Jenkins 上,您可以:

  • 让 Jenkins 进行结帐(栏为空)
  • 作为第一个构建步骤,在 .gitmodules 上执行 sed 以更改柱的 url,正如下面 OP Anthony 所建议的
  • 做一个git submodule update --init

Git modules 的文档解释:

When cloning or pulling a repository containing submodules however, these will not be checked out by default; the init and update subcommands will maintain submodules checked out and at appropriate revision in your working tree.

ENV2 你必须 运行:

git submodule init
git submodule update