繁体   English   中英

将多个补丁格式化为一个补丁

[英]Format multiple patches into a single patch

我有一系列 .patch 文件需要应用于某些代码,但我没有补丁所基于的原始来源。

我一直在使用 'git apply' 应用它们,但它并没有应用所有更改(这是一个单独的问题)。

如果我的所有 .patch 文件都被压缩成一个大补丁,我会更容易调试“git apply”(或手动应用它们)的问题。 不幸的是,我在本网站上找到的所有答案都假设您可以在补丁所基于的原始源上运行 git 命令,而我不能。

我也知道补丁的顺序。

有没有办法在没有原始源的情况下将多个补丁文件“压缩”成一个补丁? 如果您需要任何额外信息,请告诉我。

这是我认为可以压缩的两个补丁文件的示例:

$ cat patch1.patch
diff --git a/foo.c b/foo.c
index ...
--- a/foo.c
--- b/foo.c
@@ -1,2 +1,3 @@
 int main(){
+printf("1");
 }
$ cat patch2.patch
diff --git a/foo.c b/foo.c
index ...
--- a/foo.c
--- b/foo.c
@@ -1,3 +1,4 @@
 int main(){
 printf("1");
+printf("2");
 }
$ merge-patches patch1.patch patch2.patch > patch1and2.patch # this command doesn't exist, but I want it to
$ cat patch1and2.patch
diff --git a/foo.c b/foo.c
index ...
--- a/foo.c
--- b/foo.c
@@ -1,2 +1,4 @@
 int main(){
+printf("1");
+printf("2");
 }

有没有办法在没有原始源的情况下将多个补丁文件“压缩”成一个补丁?

在完全一般的情况下,没有。 幸运的是,您没有那种完全通用的情况。 😀

一个非常简单的“补丁代数”适用于简单的情况。 例如,假设我们担心单个文件。 补丁 A 表示“在第 3 行后添加两行”,补丁 B 表示“在第 10 行后添加一行”。 如果补丁 A 出现在补丁 B 之前,我们可以将它们组合成一个补丁,上面写着“在第 3 行之后添加这两行,在第 8 行之后添加另一行”,因为我们知道补丁 B 中的第 10 行一定是行补丁 A 中的 8,因为补丁 A 添加了两行,所有这些都在第 8 行之前。

如果两个补丁按其他顺序排列,则组合补丁需要在位置 3 和 10,而不是位置 3 和 8 添加线。当补丁重叠时,情况会变得更加丑陋,但即使您不这样做,您仍然可以使某些情况起作用”不知道正确的顺序,因为上下文可能会提供正确的顺序。

我也知道补丁的顺序。

这很有帮助,因为现在我们知道 A 出现在 B 之前,这是肯定的:没有必要根据上下文进行猜测。

因此,当后来的补丁修改了之前的补丁,并且我们知道它们都适用于固定的初始基础时,我们可以将它们组合起来,前提是我们知道顺序。 这可能会丢失信息(即,在组合之前,您可能能够找到真正的基础修订版;组合之后,您可能不再能够这样做)。 1如果您同意,您可以编写一个程序来执行此操作。 我不知道有任何现有的程序可以做到这一点,尽管 DARCS 是用补丁代数的概念构建的,因此是一个候选程序。 您可能会查看http://darcs.net/Theory (我自己也没怎么看)。


1我没有为此构建一个证明,但直观上很明显……这意味着它可能完全错误 😀

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM