为什么 'git submodule update' 命令会跳过一个子模块?

4

我有一个带有单个子模块sub/x的git仓库。(该子模块本身不包含任何子模块。)

在超级项目的仓库中,git status命令的输出显示了以下(未暂存)修改:

modified:   sub/x (new commits)

如果我现在运行

git submodule update

在超级项目上执行以下命令,终端会输出如下一行文字(除此之外没有其他内容):

Skipping submodule 'sub/x'

接下来,超级仓库的 git status 输出与上面显示的相同,没有改变。

(如果我在 git submodule update 命令中添加 --init,结果也是一样。)

问:我该如何确定为什么 git submodule update [--init] 跳过了 sub/x 子模块?

2个回答

8
(注:我只检查了最近的Git版本,而子模块代码一直在变化,所以这可能不是唯一的情况。但这是最新的Git中出现该消息的唯一位置。)
编辑2:似乎当超级项目的 `.git/config` 中有一个明确的 `update = none` 设置时,下面的情况适用。这比我之前的猜测更有意义;这是这里||表达式的前半部分。我假设没有 `update = none` 设置,我们从第二个部分(未指定和类型=NONE)得到这个设置,我仍然觉得这很令人困惑。
(原始答案如下)
此消息出现在 Git 子模块助手代码中:(链接)
        if (suc->update.type == SM_UPDATE_NONE
            || (suc->update.type == SM_UPDATE_UNSPECIFIED
                && update_type == SM_UPDATE_NONE)) {
                strbuf_addf(out, _("Skipping submodule '%s'"), displaypath);
                strbuf_addch(out, '\n');
                goto cleanup;
        }

当超级项目的.git/config中没有给定子模块的submodule.name.update设置,且更新类型未指定(使用git submodule update而不加--checkout参数)时,此代码会触发。

git submodule update --checkout

如果将子模块的更新设置为checkout,也可以覆盖此行为。但是,编辑:我不理解代码为什么这样:文档说默认设置是checkout,而在实际设置为checkout时,与默认设置为checkout并具有不同行为似乎不符合这一说法。


有一个实际的 none 更新类型它正在寻找。 - jthill
这是一个有趣的想法;我迫不及待想要尝试一下。不过很遗憾,我得等到明天了,因为我正在使用的系统刚刚进行维护... - kjo
@jthill: 有的,但似乎只适用于默认状态(SM_UPDATE_UNSPECIFIED;我进行了快速搜索)。还有这种奇怪的活动子模块与非活动子模块的概念,但似乎与“跳过”消息无关。我不理解这段代码背后的意图,因为文档说未设置意味着检出。 - torek
@jthill:毫无疑问,超级项目的 .git/config 文件为 sub/x 子模块设置了 update = none。我不知道为什么会有这个设定。我可以确定,我并没有通过手动编辑 .git/config 来添加它。某些其他的 git 命令一定会在操作过程中添加此设置。 - kjo
导致我写这篇文章的情况具有我“粗心大意”的特点:(1)一个Git存储库处于奇怪的故障状态,需要数小时的故障排除,(2)我对存储库如何达到这种状态毫不知情。当我开始使用带子模块的Git时,我进入了这样的阶段,但是几年前,当我第一次开始使用(纯粹的,即没有子模块)Git时,我经历了非常相似的阶段(持续了数周)。 - kjo
直到我(1)理解了Git的基本底层结构以及它是如何以非常具体的方式实现的;(2)理解了各种Git命令如何修改这个底层结构;以及(3)学会了用于故障排除的查询该结构的命令,我才能克服它。现在我需要同样的东西来处理带有子模块的Git,但我不知道该怎么做。未来几周可能会很艰难。 - kjo

1

检查您的子模块是否被忽略:

git check-ignore -v -- sub/x

请同时检查.gitmodules文件,查看任何ignore指令


谢谢,但这两个都没有结果。我的 git 版本没有 check-ignored,但它有 check-ignore。当我使用你发布的命令行时,将 check-ignored 替换为 check-ignore,我没有得到任何输出。.gitmodules 文件只有这个模块的 pathurlbranch 指令(以及其他什么也没有)。 - kjo
@kjo 你使用的Git版本是什么?在哪个操作系统上? - VonC
1
@kjo 是否有一个名为sub/x/.git的子文件夹,会使得x成为一个嵌套仓库,除了它已经是子模块的状态? - VonC
Git版本为2.17.0;操作系统为Linux(CentOS);存在一个sub/x/.git 文件,而不是子文件夹。 - kjo
1
好的。首先进行测试,查看使用 git 2.28 是否仍存在问题。 - VonC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接