排除子模块的子模块

skr*_*rat 7 git git-submodules

我有 git repo,在那里我使用extern/dir 中的git 子模块链接我的一些依赖项。假设我有一个依赖项A作为子模块,位于extern/A. 现在A本身有一些依赖项作为 git 子模块。InA的回购,即,例如。A/test/data/X.

现在,当我克隆我的 repo 并运行时git submodule update --init --recursive,为了在 CI 服务器上构建它,或者,我希望上面的命令忽略exter/A/test/data/X,因为它就像我不想要的 1G 数据。

然而,我的其他依赖项有一些有用的子模块,所以我不能跳过--recursive. 有没有办法做到这一点?

Sau*_*ari 5

您可以使用submodule.<name>.update配置变量来设置应该更新哪个子模块,如此处所述 如何从更新中排除特定的 git 子模块?.

如果要排除A中的子模块X,那么可以使用如下命令:

git -c submodule."X".update=none submodule update --init --recursive
Run Code Online (Sandbox Code Playgroud)

注意:这假设 repo A 中的子模块 X(它是 extern 的子模块)在整个 repo extern(包括其所有子模块及其子模块等...)中是唯一的如果 X 不是唯一的,那么所有名为 X 的子模块将在 repo extern 中被跳过。


您可以在克隆过程中跳过子模块,使用以下命令:

$ git -c submodule."X".update=none clone --recurse-submodules <repository>
Run Code Online (Sandbox Code Playgroud)

如果子模块位于存储库下的目录中,则子模块名称中应包含与其存储库相关的相对路径。为避免混淆,您可以从.gitmodules存储库中的文件中获取子模块名称。

考虑以下示例.gitmodules文件,

[submodule "path/to/submodule_X"]
    path = path/to/submodule_X
    url = https://github.com/<user>/<repo>
[submodule "Y"]
    path = Y
    url = https://github.com/<user>/<repo>
Run Code Online (Sandbox Code Playgroud)

如果你想跳过子模块 X,那么用这个替换<name>in 。这同样适用于嵌套的子模块。submodule.<name>.update"path/to/submodule_X"

  • 我不知道他们在哪个版本中打了补丁,但它在 2.7.4 上不起作用,但在 2.17.2 上起作用。非常感谢您花时间讨论这个问题 (2认同)