新的git diff压缩启发式不起作用

Int*_*ist 6 git git-diff

更新

由于@ torek的回答,现在已经解决了

我需要在新添加的上方添加更多行,以便Git可以向上移动diff'ed块,我的意思是:

+a
+b
+c
+
+["foo", "bar", "baz"].map do |i|
+  i
+end
+
 ["foo", "bar", "baz"].map do |i|
   i.upcase
 end
Run Code Online (Sandbox Code Playgroud)

注意:我尝试使用单个换行符而不是a\nb\nc\n它也可以使用


原始问题......

我在Mac OSX上使用Git 2.9

这是一个简化的测试用例:

$ mkdir git-highlight && cd git-highlight
$ touch foo.rb
Run Code Online (Sandbox Code Playgroud)

我添加并提交以下内容:

["foo", "bar", "baz"].map do |i|
  i.upcase
end
Run Code Online (Sandbox Code Playgroud)

现在我修改文件以具有以下内容:

["foo", "bar", "baz"].map do |i|
  i
end

["foo", "bar", "baz"].map do |i|
  i.upcase
end
Run Code Online (Sandbox Code Playgroud)

如果我要运行,git diff或者git diff --compaction-heuristic我得到以下意外输出:

diff --git a/foo.rb b/foo.rb
index 9056b22..f0d289a 100644
--- a/foo.rb
+++ b/foo.rb
@@ -1,3 +1,7 @@
 ["foo", "bar", "baz"].map do |i|
+  i
+end
+
+["foo", "bar", "baz"].map do |i|
   i.upcase
 end
Run Code Online (Sandbox Code Playgroud)

如果您从GitHub上阅读此博客文章https://github.com/blog/2188-git-2-9-has-been-released我会让我相信我的输出看起来应该更像:

+["foo", "bar", "baz"].map do |i|
+  i
+end
+
 ["foo", "bar", "baz"].map do |i|
   i.upcase
 end
Run Code Online (Sandbox Code Playgroud)

git的差异算法的想法更加智能,能够识别块变化.

我也尝试过将以下内容添加到我的内容,~/.gitconfig但它对结果没有任何影响,我仍然得到意想不到的输出:

[diff]
  compactionHeuristic = true
Run Code Online (Sandbox Code Playgroud)

关于我在这里缺少什么的想法?

Von*_*onC 11

说到"git diff压缩启发式不起作用"...... Git 2.12(2017年第一季度)将退出启发式.
Git 2.14将缩进启发式设置为默认启发式.

" git diff和它的家人有两个实验性的启发式方法来改变一个大块的内容,使补丁更容易阅读.
其中一个比另一个好,所以只留下" --indent-heuristic"选项并删除另一个.

请参阅Junio C Hamano()提交3cde4e0(2016年12月23日). 建议:杰夫金().(由Junio C Hamano合并- -提交2ced5f2,2017年1月10日)gitster
peff
gitster

详情如下:

diff:退休"压缩"启发式

当补丁插入一行线条时,其最后一行与插入块之前出现的现有线条相同," git diff"可以选择这些现有线之间的任何位置作为前置上下文和添加的线之间的边界(调整插入块的末尾(视情况而定)以提出相同补丁的变体,并且某些变体比其他变体更容易阅读.

我们一直在努力改进这个边界的选择,而Git 2.11附带了一个实验性的" compaction-heuristic".
从那时起,另一次改进逻辑的尝试进一步导致了一种新的indent-heuristic逻辑.
人们一致认为后者总体上取得了更好的结果,前者的效用已经过时了.

退出"压缩",并将"缩进"作为实验性功能.
希望后者在未来版本中默认打开,但这应该作为一个单独的步骤完成.


更新下一个Git 2.15.x/2.16(2018年第一季度):

提交bab7614通过(2017年10月29日)卡洛斯·涅托马丁(carlosmn).
(由Junio C gitsterHamano合并- -提交662ac3b,2017年11月6日)

diff:--indent-heuristic不再是实验性的

这种启发式一直是自2.14以来的默认设置,所以我们不应该混淆我们的用户,因为它是实验性的,默认情况下是关闭的.


注意:" git diff --indent-heuristic"有一个糟糕的角落案例表现,修正于Git 2.19(Q8 2018).

Stefan Beller()提交301ef85(2018年7月27日).(由Junio C Hamano合并- -提交791ad49,2018年8月17日)stefanbeller
gitster

xdiff:减少缩进启发式开销

如果我们滑动大小超过它的大小,请跳过搜索更好的缩进启发式.
这是分析提出的最简单的解决方案,以响应mercurial为xdiff限制按常量搜索的补丁.
使用性能测试:

#!python
open('a', 'w').write(" \n" * 1000000)
open('b', 'w').write(" \n" * 1000001)
Run Code Online (Sandbox Code Playgroud)

该补丁将" git diff --no-index a b" 的执行从0.70s减少到0.31s.然而,限制滑动到差异大小的大小,这被提议作为解决方案(我发现现在最容易实现)不适用于以下情况:

open('a', 'w').write(" \n" * 1000000)
open('b', 'w').write(" \n" * 2000000)
Run Code Online (Sandbox Code Playgroud)

那时我们仍然会滑动100万次.

除了限制滑动到大块的大小外,还限制了一个常数.选择100行作为常量,因为它比屏幕更合适,这实际上意味着差异滑动可能无法提供很多好处.


tor*_*rek 3

我还没有使用过这些新功能,所以这可能需要从一粒盐到完全舔盐,但是:

\n\n
\n

关于我在这里缺少什么有什么想法吗?

\n
\n\n

描述特别指出 git diff 块会向上移动直到到达空行。第1行上面没有空行;如果有的话,那就足够了。(它可能需要更多“上方”上下文\xe2\x80\x94,它不必为空\xe2\x80\x94,因为规范是包含上方和下方的三行上下文,并且从简短描述中不清楚“向上移动”是否会因缺乏额外的线路而受到阻碍。)

\n