有什么方法可以有效地应用大型 git 补丁吗?

Elp*_*Kay 5 git git-apply

我们收到了一个大补丁,修改了大约 17000 个文件。其大小为5.2G。当用 涂抹贴剂时git apply -3,12小时后仍未完成。

我们将每个文件的补丁分成更小的补丁,然后一一应用它们,这样至少我们可以看到进度。

再次卡在一个文件补丁上,仍然有111M那么大。它修改 HTML 文件。

我们将此文件补丁分成每个块更小的补丁,并获得大约 57000 个块补丁。每个块补丁大约需要 2-3 秒,因此比应用文件补丁需要更多时间。我会尝试将其分成更多块。

有什么方法可以有效地应用这么大的补丁吗?谢谢。

更新:

正如@ti7建议的,我尝试了一下patch,它解决了问题。

就我而言,我们有两种大补丁。

一种是添加/删除大型二进制文件,并且二进制文件的内容作为文本包含在补丁中。其中一个二进制文件大小为 188M,删除它的补丁大小为 374M。

另一种是修改大文本,有数百万次的删除和插入。其中一个文本文件前70M,后162M。补丁大小为181M,有2388623个插入和426959个删除。

经过一些测试,我认为这里的“大”描述的是插入和删除的数量。

对于二进制补丁,

  • git apply -3, 7 秒
  • git 应用,6 秒
  • 补丁,5 秒

对于文本补丁,

  • git apply -3,卡住了,10分钟后还没完成
  • git apply,卡住了,10分钟后还没完成
  • 补丁,3秒

该二进制文件仅包含 1 处插入和/或 1 处删除。git apply或者patch可以在几秒钟内完成。一切都可以接受。

文本插入和删除过多。显然,patch在这种情况下要好得多。我阅读了一些帖子patch并了解到某些版本patch无法添加/删除/重命名文件。幸运的是,patch在我的机器上运行良好。

因此,我们将一体化补丁拆分为每个文件的更小的补丁。我们timeout 10s git apply -3 file_patch先尝试一下。如果无法在 10 秒内完成,请尝试timeout 10s patch -p1 < file_patch.

最后,大约用了1个半小时,17000个补丁全部贴好了。这比打了多合一补丁后 12 小时什么也没做要好得多。

而且我也尝试过patch -p1 < all_in_one_patch。只用了1分27秒。所以我认为我们可以进一步改进我们的补丁流程。

ti7*_*ti7 2

您也许可以使用patch维基百科)来git apply加快修补速度!

据我所知,patch直接逐行输出一个新文件,拼接更改,同时git apply进行额外的上下文检查(正如@j6t在评论中指出的那样,尽管我还没有确认,但会尝试加载和在写出之前立即修补整个文件)