我想做一些我认为应该很简单的事情,但却变成了一个兔子洞,我认为一定有更好的方法。
假设您有两个针对源文件的连续修补文件(表示连续更改),但没有源文件本身。
如何将两个补丁合并为一个补丁,代表合并后的更改集。将合并后的补丁应用到源文件的结果应该与依次应用两个补丁的结果相同。所有上下文都应该保留
有没有一个著名的算法?
比如说,拿这两块补丁
@@ -1,1 +1,2 @@
+ add this first line
this line is just context
@@ -1,2 +1,2 @@
- add this first line
+ change the first line
this line is just context
@@ -7,2 +7,2 @@
context
- change this line
+ to this one
more context
结果将是:
@@ -1,1 +1,2 @@
+ change the first line
this line is just context
@@ -7,2 +7,2 @@
context
- change this line
+ to this one
more context
我为这个用例找到的唯一工具/库是这个,但在测试中它有很多bug,代码太密集,我无法理清底层算法是什么:https://github.com/twaugh/patchutils
1条答案
按热度按时间lnlaulya1#
首先我修复了补丁文件中的语法错误:
---
和+++
行。@@
块中的数字必须与后面的行匹配,因此我将2
更改为3
,以便包含more context
行。p1现在是:
P2现在是:
运行
combinediff p1 p2
导致:运行
combinediff -U1 p1 p2
导致:结果与您的预期有两处不同:
@@ -1
而不是@@ -1,1
。这是允许的缩写。@@ -6,3
而不是@@ -7,3
,这正确地说明了第一个修补程序添加的1行。除了未实现的特性之外,在我看来,这与预期完全一致。