如何在给定标签上添加浅git子模块

时间:2016-01-16 17:22:19

标签: git git-submodules git-tag

我想在我的项目中包含一个大型git存储库作为子模块。为了减少项目中开发人员的下载时间,我想添加子模块,以便在克隆时只检索一个版本。另外,我需要的版本是旧版本,标有标签。

如何在添加模块或设置新克隆时实现此目的?

2 个答案:

答案 0 :(得分:1)

this answer中所述,您可以使用--depth参数:

git submodule add --depth 1 -- repository path
git submodule update --depth -- [<path>...]

答案 1 :(得分:1)

标记实际上是一个人类可读的提交版本,当您向项目添加子模块时,您添加它的项目将在该提交哈希中存储子模块的状态。它并不指向HEAD,而是指向添加子模块时的确切时间点。

例如,game-music-emu @ 21a064e完全是21a064e的提交,这是子模块默认工作的方式。

如果提交存在于默认(例如master)分支中,--depth 1应该只从您要查找的标记中获取提交历史记录。另一方面,默认行为是从默认(例如master)分支带来所有提交历史记录,这就是为什么浅层或--depth 1需要作为子模块的一部分的原因命令。这就是默认克隆git存储库的方式。

您可以使用git add path/to/submodule保存您的子模块当前所在的提交。请注意,子模块和它所在的父文件夹是两个单独的存储库!

注意......如果提交存在于另一个分支上,git submodule add也支持--branch选项,文档说明.gitmodules文件将包含branch = somebranchname的条目但是在测试中,git 1.9.1似乎没有遵守这一点,并且无论如何使用默认(例如master)分支。

为了回答这个问题,为了让开发人员更快地完成这项工作,请在构建系统中编写一个帮助程序脚本,使用git submodule--depth结合,自动在浅深处提取子模块参数,或者更新您的文档以指定--depth 1,以加快克隆时间。

最后,git submodule还支持foreach [--recursive] <command>选项,该选项将允许每个子模块上的自定义命令。

以下是我在cmake中为整个项目进行浅层深度延迟抓取的示例。  https://gist.github.com/tresf/263ea897036fa762674d489c8d457d68