git 将两个贴片合并为一个贴片的算法?

q1qsirdb  于 2023-03-06  发布在  Git
关注(0)|答案(1)|浏览(115)

我想做一些我认为应该很简单的事情,但却变成了一个兔子洞,我认为一定有更好的方法。
假设您有两个针对源文件的连续修补文件(表示连续更改),但没有源文件本身。
如何将两个补丁合并为一个补丁,代表合并后的更改集。将合并后的补丁应用到源文件的结果应该与依次应用两个补丁的结果相同。所有上下文都应该保留
有没有一个著名的算法?
比如说,拿这两块补丁

@@ -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

lnlaulya

lnlaulya1#

首先我修复了补丁文件中的语法错误:

  • 补丁文件必须有一个文件头,所以我添加了---+++行。
  • 上下文行以一个空格开始,所以我添加了``。
  • @@块中的数字必须与后面的行匹配,因此我将2更改为3,以便包含more context行。

p1现在是:

--- old
+++ new
@@ -1,1 +1,2 @@
+ add this first line
 this line is just context

P2现在是:

--- old
+++ new
@@ -1,2 +1,2 @@
- add this first line
+ change the first line
 this line is just context
@@ -7,3 +7,3 @@
 context
- change this line
+ to this one
 more context

运行combinediff p1 p2导致:

combinediff: hunk-splitting is required in this case, but is not yet implemented
combinediff: use the -U option to work around this

运行combinediff -U1 p1 p2导致:

diff -U1 new new
--- new
+++ new
@@ -1 +1,2 @@
+ change the first line
 this line is just context
@@ -6,3 +7,3 @@
 context
- change this line
+ to this one
 more context

结果与您的预期有两处不同:

  • 生成的补丁包含@@ -1而不是@@ -1,1。这是允许的缩写。
  • 生成的修补程序具有@@ -6,3而不是@@ -7,3,这正确地说明了第一个修补程序添加的1行。

除了未实现的特性之外,在我看来,这与预期完全一致。

相关问题