“补丁”是否适用于非对称上下文?

Kar*_*Vlk 6 diff patch

我有文件a

This
file
does
have
an error
in it
that
needs
to be
fixed.
Run Code Online (Sandbox Code Playgroud)

和一个类似的文件b

This
file
does
have
no error
in it
that
needs
to be
fixed.
Run Code Online (Sandbox Code Playgroud)

我可以使用以下命令创建统一的差异diff -u a b

--- a   2018-01-03 14:20:22 +0100
+++ b   2018-01-03 14:20:37 +0100
@@ -2,7 +2,7 @@
 file
 does
 have
-an error
+no error
 in it
 that
 needs
Run Code Online (Sandbox Code Playgroud)

我还可以使用以下命令将上下文减少到两侧的一行diff -u1 a b

--- a   2018-01-03 14:20:22 +0100
+++ b   2018-01-03 14:20:37 +0100
@@ -4,3 +4,3 @@
 have
-an error
+no error
 in it
Run Code Online (Sandbox Code Playgroud)

这两个补丁都可以用 干净地应用patch。然而,我没有找到一种方法来生成具有diff不对称上下文的补丁。我假设它不能做到这一点。因此,我尝试手动删除一些上下文,以在更改之前和之后制作一个包含两行上下文的补丁:

--- a   2018-01-03 14:20:22 +0100
+++ b   2018-01-03 14:20:37 +0100
@@ -3,4 +3,4 @@
 does
 have
-an error
+no error
 in it
Run Code Online (Sandbox Code Playgroud)

这对我来说在统一格式中似乎是有效的。然而,patch抱怨它不得不诉诸模糊测试:

patching file a
Hunk #1 succeeded at 3 with fuzz 1.
Run Code Online (Sandbox Code Playgroud)

我是否做错了什么,或者(GNU)patch实际上因不对称上下文而被破坏,因为没有人想象它们会被使用,因为diff无论如何都无法制造它们?

同样有趣的是,如果我反转不对称性,即前面一行和后面两行,则该补丁会起作用:

--- a   2018-01-03 14:20:22 +0100
+++ b   2018-01-03 14:20:37 +0100
@@ -4,4 +4,4 @@
 have
-an error
+no error
 in it
 that
Run Code Online (Sandbox Code Playgroud)

Tho*_*key 2

POSIX 标准没有提供生成非对称上下文的方法。在一种情况下,GNU 补丁通过接受格式错误的补丁来提供帮助。

顺便说一句,问题中指出的手册页做出了错误的陈述:

目前,只有 GNU diff 可以生成这种格式,并且只有 GNU patch 可以自动应用这种格式的 diff。为了正确操作,补丁通常需要至少三行上下文。

错误仍然存​​在于diffutils信息文件中。

POSIX 补丁处理统一差异。