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

Is there any method to efficiently apply large git patches?

我们收到了一个大补丁,修改了大约 17000 个文件。它的大小是5.2G。使用 git apply -3 应用补丁时,它在 12 小时后没有完成。

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

又一次卡在了一个文件补丁上,还是111M那么大。它修改了一个 HTML 文件。

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

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

更新:

按照@ti7的建议,我试了patch,问题解决了。

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

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

另一个正在修改一个大文本,有百万级的增删改查。其中一个文本文件前70M,后162M。补丁大小为181M,有2388623个插入和426959个删除。

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

对于二进制补丁,

对于文本补丁,

二进制只有1个插入and/or1个删除。 git applypatch 可以在几秒钟内完成。都可以接受。

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

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

最后,17000个补丁全部打完,用了大概1个半小时。这比应用一体机补丁并卡住 12 小时无所事事要好得多。

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

您可以使用 patch (Wikipedia) 而不是 git apply 来加快修补速度!

据我所知,patch 直接假脱机生成一个新文件 by-lines,并在其中拼接更改,而 git apply 会进行额外的上下文检查(并且 ,虽然我还没有确认,但会在写出之前尝试一次加载和修补整个文件)