首页 > 解决方案 > 排除子模块的子模块

问题描述

我有 git repo,我在extern/dir 中使用 git 子模块链接我的一些依赖项。假设我有一个A作为子模块的依赖项,位于extern/A. 现在A它本身有一些依赖项作为 git 子模块。在A's repo 中,也就是说,例如。A/test/data/X.

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

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

标签: gitgit-submodules

解决方案


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

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

git -c submodule."X".update=none submodule update --init --recursive

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


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

$ git -c submodule."X".update=none clone --recurse-submodules <repository>

如果子模块位于存储库下的目录中,则相对于其存储库的相对路径应包含在子模块名称中。为避免任何混淆,您可以从.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>

如果您想跳过子模块 X,则将<name>in替换submodule.<name>.update为 this "path/to/submodule_X"。这同样适用于嵌套子模块。


推荐阅读