You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

二级嵌套子模块下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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 14:37:42