我有文件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)
POSIX 标准没有提供生成非对称上下文的方法。在一种情况下,GNU 补丁通过接受格式错误的补丁来提供帮助。
顺便说一句,问题中指出的手册页做出了错误的陈述:
目前,只有 GNU diff 可以生成这种格式,并且只有 GNU patch 可以自动应用这种格式的 diff。为了正确操作,补丁通常需要至少三行上下文。
错误仍然存在于diffutils信息文件中。
POSIX 补丁处理统一差异。