二级嵌套子模块下git fetch --recurse-submodules=yes执行失败原因
二级嵌套Git子模块执行
git fetch --recurse-submodules=yes失败的原因? 在实际场景中遇到一个问题:当子模块存在二级嵌套时,执行git fetch --recurse-submodules=yes会失败,但在同一仓库树中进行单层级拉取(任意两层之间)却能正常工作。以下是可复现的最小示例:
在包含如下Makefile的目录中执行gmake,可创建三个本地仓库:
define create-repo = mkdir $@ cd $@ && git init && touch $@-file && git add $@-file && git commit -m "initial commit" && git remote add origin $(CURDIR)/$@ endef default: top-repo sub-repo-level-1: $(create-repo) sub-repo-level-2: $(create-repo) top-repo: sub-repo-level-1 sub-repo-level-2 $(create-repo) cp -r sub-repo-level-1 $@/ cp -r sub-repo-level-2 $@/sub-repo-level-1/ cd $@/sub-repo-level-1 && git submodule add ./sub-repo-level-2 sub-repo-level-2 && git commit -m "added submodule level 2" cd $@ && git submodule add ./sub-repo-level-1 sub-repo-level-1 && git commit -m "added submodule level 1"
生成的目录树如下:
$ tree . ├── Makefile ├── sub-repo-level-1 │ └── sub-repo-level-1-file ├── sub-repo-level-2 │ └── sub-repo-level-2-file └── top-repo ├── sub-repo-level-1 │ ├── sub-repo-level-1-file │ └── sub-repo-level-2 │ └── sub-repo-level-2-file └── top-repo-file
top-repo现在包含嵌套子模块,这些子模块的远程仓库设置为与top-repo同级的仓库(实际场景中为真实远程仓库)。
测试发现,单层级嵌套时git fetch --recurse-submodules=yes可正常工作,但二级嵌套时会失败:
- 在最底层两层执行单层级拉取无问题:
$ (cd top-repo/sub-repo-level-1/; git fetch --recurse-submodules=yes) From /tmp/submodule-fetch/sub-repo-level-1 * [new branch] main -> origin/main Fetching submodule sub-repo-level-2 From /tmp/submodule-fetch/sub-repo-level-2 * [new branch] main -> origin/main
- 从
top-repo拉取时,单层级到sub-repo-level-1正常,但二级拉取到sub-repo-level-2报错:
$ (cd top-repo; git fetch --recurse-submodules=yes) From /tmp/submodule-fetch/top-repo * [new branch] main -> origin/main Fetching submodule sub-repo-level-1 Could not access submodule 'sub-repo-level-2' Errors during submodule fetch: sub-repo-level-1
git submodule status --recursive输出:
$ (cd top-repo; git submodule status --recursive) 90daaf3e00ed8ea57af77019d03d58357ae5cdf9 sub-repo-level-1 (heads/main) caa3896c80802299d5b224bcc84a7c68a6cb1a1c sub-repo-level-1/sub-repo-level-2 (heads/main)
Git版本:
$ git --version git version 2.43.0
请问这一现象的原因是什么?
内容的提问来源于stack exchange,提问作者jhu
相关产品推荐
相关产品推荐

