排除子模块的子模块

时间:2019-06-24 23:30:15

标签: git dependencies git-submodules

我有git repo,可在extern/目录中使用git子模块链接一些依赖项。假设我有一个依赖项A作为子模块,位于extern/A。现在A本身具有一些依赖项,如git子模块。在A的仓库中,例如A/test/data/X

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

但是,我的其他依赖项具有一些有用的子模块,因此我不能只跳过--recursive。有办法吗?

2 个答案:

答案 0 :(得分:3)

您可以使用submodule.<name>.update配置变量来设置应更新的子模块,如此处所述 How to exclude a specific git submodule from update?

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

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

注意:这假设仓库reA中的子模块X(是extern的子模块)在整个仓库extern(包括其所有子模块,及其子模块,等等... )。如果X不是唯一的,则在回购extern中将跳过所有名为X的子模块。


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

$ 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>替换submodule.<name>.update中的"path/to/submodule_X"。嵌套子模块也是如此。

答案 1 :(得分:0)

执行此操作的一种可能方法是将要忽略的子模块的路径添加到主存储库的.gitignore文件中。在您的情况下,

#.gitignore
extern/A/test/data/X/*

要取消跟踪,您可能想要这样做,

git rm -r --cached extern/A/test/data/X/

注意:我尚未对其进行测试,因此请尝试克隆您的项目

或者,您可以使用submodule.<name>.update配置变量来设置应更新的子模块,如此处所述 How to exclude a specific git submodule from update?

git -c submodule."extern/A/test/data/X".update=none submodule update --init --recursive

以上命令为子模块“ extern / A / test / data / X”禁用更新