我想在我的项目中包含一个大型 git 存储库作为子模块。为了减少项目中开发人员的下载时间,我想添加子模块,以便在克隆时仅检索一个版本。另外,我需要的版本是标有标签的旧版本。
添加模块或设置新克隆时如何实现此目的?
最佳答案
该标签实际上是提交的人类可读版本,当您将子模块添加到项目时,您添加到的项目将在该提交哈希处存储子模块的状态。它并不指向 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
自动在较浅的深度 pull 入子模块。与 --depth
结合参数,或者更新您的文档以指定 --depth 1
因此加快克隆时间。
最后,git submodule
还支持foreach [--recursive] <command>
选项将允许在每个子模块上执行自定义命令。
这是我正在 cmake 中处理的一个示例,用于在整个项目的浅深度进行延迟获取。 https://gist.github.com/tresf/263ea897036fa762674d489c8d457d68
关于git - 如何在给定标签处添加浅 git 子模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34829824/