我想在我的项目中包含一个大型git存储库作为子模块。为了减少项目中开发人员的下载时间,我想添加子模块,以便在克隆时只检索一个版本。另外,我需要的版本是旧版本,标有标签。
如何在添加模块或设置新克隆时实现此目的?
答案 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