git:切换分支时避免 C++ 源代码重新编译



我们有一个 git 存储库,其中包含 4 个共享大量源代码文件的 c++ 项目。这些是我们的 git 分支:

  • master:用于主开发(目前正在开发Proj2版本4.x(
  • backports/proj1_4.x:当我们发布Proj1版本4.0时,从master分支出来,它包含错误修复,用于发布版本4.1,4.2
  • backports/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_URLgit clone --shared DIR
    • 由于父存储库不知道其其他克隆,因此在主存储库中删除对象时,该对象可能会在子存储库中变为未引用,从而可能损坏子存储库。

你会推荐什么?还有其他/更好的解决方案吗?

我们在几个项目中成功地使用了 ccache。

我建议您尝试使用ccache(非常易于安装和使用(。 首先进行一次编译,然后检查使用的缓存大小

ccache -s

之后,将最大缓存大小设置为第一次编译中使用的缓存大小的两倍,然后尝试您的挑选行为并再次检查 ccache 统计信息。 做需要的调整。

这最终可能不是最适合您的解决方案,但 ccache 非常易于安装和使用(并且不需要普通开发人员的任何更改行为(,因此它是一个唾手可得的果实。

最新更新