git 子模块中的自定义命令。<name>.update

custom command in git submodule.<name>.update

我正在尝试向 .gitmodule 文件添加自定义命令。根据文档:

arbitrary shell command that takes a single argument (the sha1 of the commit recorded in the superproject) is executed. When submodule.<name>.update is set to !command, the remainder after the exclamation mark is the custom command.

我尝试了如下操作:

[submodule "mysub"]
    path = mysub
    url = mysub-url
    branch = a-branch
    update = !ls   <<  a custom command is here

此外,submodule-config.c 中的代码包含:

    } else if (!strcmp(item.buf, "update")) {
        if (!value)
            ret = config_error_nonbool(var);
        else if (!me->overwrite &&
             submodule->update_strategy.type != SM_UPDATE_UNSPECIFIED)
            warn_multiple_config(me->treeish_name, submodule->name,
                         "update");
        else if (parse_submodule_update_strategy(value,
             &submodule->update_strategy) < 0 ||
             submodule->update_strategy.type == SM_UPDATE_COMMAND)  //<<< bummer! is it supposed to be
            die(_("invalid value for %s"), var);
    }

然而,所有这样做的尝试都以:致命:子模块的无效值...

那么,知道子模块更新中的自定义命令发生了什么吗?这只是一个从未被测试过的疏忽吗?我错过了什么吗?

我用的是git2.26.0

However, all attempts to do so end up in: fatal: invalid value for submodule...

要么 Git 版本太旧,无法支持该自定义命令选项(最初在 Git v1.6.1-rc1, Q3 2008

或者执行git submodule update时命令不在你的$PATH中。

经过一些挖掘,我现在认为这种行为是故意的,但它没有反映在文档和错误消息中。

事实上,如果在.git/config中配置,它就可以工作。

原因可能是:“通过克隆传递指向自定义命令的指针最终会导致无法访问自定义命令的路径。因此,.gitmodules 只能包含预定义的关键字。否则,.git/config 可用于在本地配置中配置它。”。我不一定同意这一点。这完全取决于项目的意图。

无论如何,git怪显示这一行:

e904deb89d9 (Jonathan Nieder      2019-12-05 01:28:28 -0800 498)                         submodule->update_strategy.type == SM_UPDATE_COMMAND)

和提交的日志日志:

 e904deb89d - submodule: reject submodule.update = !command in .gitmodules (1 year, 1 month ago) <Jonathan Nieder>
*   d3ac8c3f27 - Sync with 2.14.6 (1 year, 1 month ago) <Johannes Schindelin>
|\  
| * 66d2a6159f - (tag: v2.14.6) Git 2.14.6 (1 year, 1 month ago) <Johannes Schindelin>

所以,这个故意的,看起来是在 2.14.6 之后添加的。 @torek 建议这是出于安全考虑。我同意这是有道理的。

但是,如果在文档中的错误消息 and/or 中详细说明这一点就好了。