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

Why would 'git submodule update' skip a submodule?

我有一个 git 带有单个子模块 sub/x 的存储库。 (这个子模块不包含它自己的任何子模块。)

在超级项目的回购中,git status 的输出显示了以下(未暂存的)修改

modified:   sub/x (new commits)

如果我现在运行

git submodule update

...在超级项目上,以下行被打印到终端(仅此而已):

Skipping submodule 'sub/x'

此后,superproject上git status的输出如上所示,没有变化。

(同上,如果我将 --init 添加到 git submodule update 命令。)

问: 我如何确定 git submodule update [--init] 跳过 sub/x 子模块的原因?

检查你的子模块本身是否被忽略:

git check-ignore -v -- sub/x

同时检查 .gitmodules 文件,for any ignore directive

(注意:我只查看了最近的Git版本,子模块代码一直在变化,所以这可能不是唯一的情况。但这是消息唯一可以的地方发生在最近 Git.)

编辑 2: 当超级项目的 .git/config 中有明确的 update = none 设置时,下面的情况似乎适用。这比我在下面所做的猜测更有意义;这是 || 表达式的前半部分。我假设没有 update = none 设置,我们从后半部分得到这个(未指定和类型 =NONE),但我仍然觉得很困惑。

(下面继续原回答)


此消息出现在 the Git submodule helper code:

        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;
        }

当没有 submodule.<em>name</em>.update setting setting in the superproject's .git/config for the given submodule 时,此代码会触发,并且未指定更新类型(git submodule update 没有 --checkout)。所以:

git submodule update --checkout

会覆盖它,就像将子模块的更新设置配置为 checkout 一样。 编辑:不明白为什么代码是这样的:the documentation说默认是checkout,并且实际设置设置为 checkout 与默认设置为 checkout 的行为不同,似乎与此声明不符。