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

How to add a shallow git submodule at a given tag

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

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

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

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

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

例如,game-music-emu @ 21a064e 正好在 21a064e 的提交处,这就是子模块默认的工作方式。

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

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

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

因此,为了回答这个问题,为了让您的开发人员更快地完成此操作,请在您的构建系统中编写一个帮助脚本,以使用 git submodule 结合 --depth 参数,或者更新您的文档以指定 --depth 1 以加快克隆时间。

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

这是我在 cmake 中处理的一个示例,用于在整个项目的浅层深度进行延迟获取。 https://gist.github.com/tresf/263ea897036fa762674d489c8d457d68