我们有一个 git 存储库,其中包含 4 个共享大量源代码文件的 c++ 项目。这些是我们的 git 分支:
master
:用于主开发(目前正在开发Proj2版本4.x(backports/proj1_4.x
:当我们发布Proj1版本4.0时,从master分支出来,它包含错误修复,用于发布版本4.1,4.2backports/proj2_3.x
:与 proj2 版本 3.x 相同backports/proj3_2.x
: ...backports/proj4_2.x
: ...
当我们修复 master 中的错误时,我们会挑选修复到所有向后移植分支。拥有存储库的单个克隆意味着每次我们在这些分支之间切换时,都需要重新编译大量 c++ 对象文件。
现有解决方案
- 多个完整克隆
- 签出每个克隆中的不同分支。
- 需要大量的磁盘空间(我们的.git文件夹有~700MB(,但避免了分支之间的切换,因此也避免了目标文件的重新编译。这可能是最简单的解决方案。
- 具有签出前后 git 挂钩的单个克隆,用于存储和恢复源文件的对象文件或时间戳:https://stackoverflow.com/a/3195312/1341914
- git 工作树
- 将单个
.git
文件夹用于多个存储库文件夹。 - 警告:截至 2020 年第 2 季度,子模块无法使用:https://git-scm.com/docs/git-worktree#_bugs,但我不确定"多次结帐"是什么意思。
- 将单个
- 缓存
- 长时间在 master 上工作时,缓存 DIR 可能只包含来自 master 的对象文件,因为来自向后移植分支的旧对象文件不适合 ccache 存储限制。
- 主节点的完整克隆 + 向后移植分支的浅层克隆
- 当克隆只有深度为 1 时,我们将如何挑选提交?提交 SHA1 不会在浅层克隆中找到,但我们可以将提交导出为补丁文件,然后将其应用于浅层克隆
- 共享/参考
git clone --reference DIR GIT_REPO_URL
或git clone --shared DIR
- 由于父存储库不知道其其他克隆,因此在主存储库中删除对象时,该对象可能会在子存储库中变为未引用,从而可能损坏子存储库。
你会推荐什么?还有其他/更好的解决方案吗?
我们在几个项目中成功地使用了 ccache。
我建议您尝试使用ccache(非常易于安装和使用(。 首先进行一次编译,然后检查使用的缓存大小
ccache -s
之后,将最大缓存大小设置为第一次编译中使用的缓存大小的两倍,然后尝试您的挑选行为并再次检查 ccache 统计信息。 做需要的调整。
这最终可能不是最适合您的解决方案,但 ccache 非常易于安装和使用(并且不需要普通开发人员的任何更改行为(,因此它是一个唾手可得的果实。