我有一个包含子模块的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
的其他网址,例如
git submodule add git@env2:group/bar.git
答案 0 :(得分:1)
子模块是url + SHA1引用。
您的镜像将镜像SHA1引用(gitlink,父Git仓库中的特殊条目,已镜像)
但是由于子模块repo本身没有镜像......父repo可以引用在(非镜像)图像栏子模块repo中不存在的SHA1。 (或者如果在镜像环境中根本不存在条形,则无论如何对任何SHA1都是空的)
镜像的父级仓库必须能够引用可访问且最新的条形仓库。
不要尝试在本地更改它,而是检查url.<base>.insteadOf
之类的配置是否有用:目标是使用git@env2
而不是git@env1
,但不更改git@env1
}在.gitmodules
。
clone --recursive
或clone
后跟git submodule update --init
将填充bar
子模块。
作为解决方法,在Jenkins上,你可以:
sed
上的.gitmodules
作为第一个构建步骤更改栏的网址,如下面OP Anthony所示git submodule update --init
答案 1 :(得分:0)
Git modules的文档解释了:
当克隆或拉出包含子模块的存储库时,默认情况下不会检出这些存储库;
init
和update
子命令将维护子模块,并在工作树中以适当的版本进行检查。
在ENV2
上你必须运行:
git submodule init
git submodule update