排除子模块的子模块

11
我有一个git仓库,在external/目录中使用git子模块链接一些依赖项。例如,我有一个名为A的子模块,位于extern/A。现在,A本身具有一些依赖关系,也是作为git子模块存在的。在A的仓库中,例如A/test/data/X
当我克隆我的仓库并运行git submodule update --init --recursive时,为了在CI服务器或其他地方进行构建,我希望上述命令忽略exter/A/test/data/X,因为它大约有1G的数据是我不想要的。
然而,我的其他依赖项具有一些有用的子模块,因此我不能跳过--recursive。有没有办法做到这一点?

3
可能是 如何从更新中排除特定的Git子模块? 的重复。 - Saurabh P Bhandari
@SaurabhPBhandari 这绝对不是那个问题的重复。这是一个有效的问题。 - Zatarra
1
@zatarra 为什么它是“无效的”? - Jonas Wilms
1
@Zatarra,由于子模块位于名为tests的目录中,因此在这种情况下,子模块名称将是“tests/viper-test-files”,然后命令将是git -c submodule."tests/viper-test-files".update=none submodule update --init --recursive - Saurabh P Bhandari
god@supermachine:/git-test$ git clone https://github.com/MISP/MISP.git > /dev/null 2>&1 god@supermachine:/git-test$ ls MISP god@supermachine:/git-test$ cd MISP/ god@supermachine:/git-test/MISP$ git -c submodule."tests/viper-test-files".update=none submodule update --init --recursive > /dev/null 2>&1 god@supermachine:/git-test/MISP$ ls PyMISP/tests/viper-test-files/ README.md test_files god@supermachine:/git-test/MISP$ - Zatarra
显示剩余6条评论
2个回答

8
你可以使用submodule.<name>.update配置变量来设置应该更新哪个子模块,如此处所述:如何从更新中排除特定的git子模块?
如果你想要在A中排除子模块X,那么可以使用以下命令:
git -c submodule."X".update=none submodule update --init --recursive

注意:以下假设 A 仓库中的子模块 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,那么请将submodule.<name>.update中的<name>替换为"path/to/submodule_X"。对于嵌套的子模块也适用。

2
我不知道他们在哪个版本中进行了补丁,但它在2.7.4上无法工作,但在2.17.2上可以。非常感谢您在此问题上花费的时间。 - Zatarra

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接