我有一系列的.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");
}
答案 0 :(得分:0)
有没有办法在没有原始源的情况下将多个补丁文件压缩为一个补丁?
在一般情况下,不会。幸运的是,您没有那种一般情况。 ?
一个非常简单的“补丁代数”适用于简单的情况。例如,假设我们担心一个文件。补丁A说“在第3行后添加两行”,补丁B说“在第10行后添加一行”。如果补丁A在补丁B之前,我们可以将它们组合成一个补丁,说“在第3行之后添加这两行,在第8行之后添加另一行”,因为我们知道补丁B中的第10行一定是补丁A中的第8行,因为补丁A添加了两行,所有行都在第8行之前。
如果两个补丁的排列顺序相反,则合并的补丁需要在位置3和10处添加行,而不是在3和8处添加行。当补丁重叠时,事情变得非常难看,但您仍然可以使 some < / em>案例即使您不知道正确的顺序也会起作用,因为上下文可能会提供正确的顺序。
我也知道补丁的顺序。
这很有帮助,因为现在我们确定A肯定早于B,因此:无需根据上下文进行猜测。
因此,当以后的补丁修改了以前的补丁时,和我们知道它们都适用于固定的初始基数,只要我们知道顺序,就可以 将它们组合在一起。这可能会丢失信息(即,在合并之前,您可以找到真正的基本修订版;在 合并后,您可能不再能够这样做)。 sup> 1 如果可以的话,您可以编写一个执行此操作的程序。我不知道有任何现有的程序可以执行此操作,尽管DARCS是以补丁代数的概念构建的,因此是候选对象。您可能会看http://darcs.net/Theory(我自己没看太多)。
1 我尚未为此建立证明,但从直觉上来说很明显……这意味着it could be completely wrong。 ?