增加统一差异上下文行的数量有什么缺点吗?

And*_*ier 6 git diff

默认情况下,diff -ugit diff使用上下文行生成统一的差异。除了 diff 文件本身的大小,增加上下文行的数量有什么缺点吗?我认为这可能有助于在打补丁后要打补丁的文件被修改的情况下。具体来说,如果您增加上下文行的数量,是否patch会出现失败的情况,如果您不这样做就不会失败?

Sha*_*baz 6

上下文的大小对补丁有两个主要影响:

  1. 上下文越大,您就越确定在正确的上下文中应用补丁。
  2. 上下文越大,可以将更多的变化集中到一个块中。

考虑以下示例(故意拼写错误):

original file:                     Changed file:

This is                            This is
some tex.                          some text.
You are on                         You are on
stackoverflo.com                   stackoverflo.com
Completely unrelated               Completely unrelated
tet here.                          text here.
Goodbye.                           Goodbye.
Run Code Online (Sandbox Code Playgroud)

其中上下文大小为 1 行,您将获得包含两个块的补丁:

@@ -1,2 +1,3 @@
 This is
-some tex.
+some text.
 You are on
@@ -4,3 +5,3 @@
 Completely unrelated
-tet here.
+text here.
 Goodbye.
Run Code Online (Sandbox Code Playgroud)

如果上下文大小为 3 行,您将获得一个包含一大块的补丁:

@@ -1,6 +1,7 @@
 This is
-some tex.
+some text.
 You are on
 stackoverflo.com
 Completely unrelated
-tet here.
+text here.
 Goodbye.
Run Code Online (Sandbox Code Playgroud)

现在想象一下第二个修复:

Changed file:                      Further changed file:

This is                            This is
some text.                         some text.
You are on                         You are on
stackoverflo.com                   stackoverflow.com
Completely unrelated               Completely unrelated
text here.                         text here.
Goodbye.                           Goodbye.
Run Code Online (Sandbox Code Playgroud)

这里的补丁是:

@@ -3,3 +3,3 @@
 You are on
-stackoverflo.com
+stackoverflow.com
 Completely unrelated
Run Code Online (Sandbox Code Playgroud)

现在,假设您颠倒了修补顺序。因此,您首先应用第二个补丁(修复flow地址),然后应用第一个补丁之一(使用-U 1-U 3)。

  • 在补丁的情况下,-U 1应用干净。
  • 如果-U 3补丁不干净,补丁可能会失败或接受模糊。

结论

首先考虑极端情况。如果您的上下文为零,则很容易将补丁弄错或将块应用到错误的行。如果您有无限的上下文,那么每个补丁基本上都会成为文件的整体替换,从而很难对补丁进行重新排序。

所以很容易理解,太低和太高的上下文都是不好的。因此,显然应该在更好的匹配和发现个体变化之间进行权衡。

不幸的是,没有最佳的行数,可以说默认的上下文大小是开发人员集体认为的一种公平权衡。如果它对你的事业有帮助,你可以增加它,但要小心其影响。


blu*_*ubb 5

是的。考虑以下情况:

有一个文件f1

a
b
c
d
e
f
g
Run Code Online (Sandbox Code Playgroud)

您修改该f行,并获得

--- f1  2013-04-15 13:23:57.524966109 +0200
+++ f2  2013-04-15 13:25:17.832965720 +0200
@@ -5,3 +5,3 @@
 e
-f
+f2
 g
Run Code Online (Sandbox Code Playgroud)

或者

--- f1  2013-04-15 13:23:57.524966109 +0200
+++ f2  2013-04-15 13:25:17.832965720 +0200
@@ -1,7 +1,7 @@
 a
 b
 c
 d
 e
-f
+f2
 g
Run Code Online (Sandbox Code Playgroud)

取决于您是使用-U1还是-U5选项diff。现在假设其他人编辑了文件的上半部分,如下所示:

a
b1
c
d
e
f
g
Run Code Online (Sandbox Code Playgroud)

这是两个patch命令的输出:

$ patch f3 < u1.patch 
patching file f3
$ patch f3 < u5.patch 
patching file f3
Hunk #1 succeeded at 1 with fuzz 2.
Run Code Online (Sandbox Code Playgroud)

该补丁在两种情况下都成功应用,但是,在第二次运行中,我们必须使用模糊值 2。这意味着什么?

第一个补丁查找上下文所有行都匹配的地方。如果没有找到这样的地方,并且它是上下文差异,并且最大模糊因子设置为 1 或更大,则会进行另一次扫描,忽略上下文的第一行和最后一行。如果失败,并且最大模糊因子设置为 2 或更多,则上下文的前两行和最后两行将被忽略,并进行另一次扫描。

从上面的描述中可以看出,在这种情况下,man patch使用-U5版本创建的补丁需要更长的时间才能应用,更糟糕的是,如果使用的fuzz值patch不够大,则应用补丁将失败。