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

时间:2016-06-18 08:50:41

标签: git git-diff

更新

现在已经解决了,感谢@ torek的回答

我需要在新添加项目上方添加更多行,以便Git可以向上移动差异块,我的意思是:

+a
+b
+c
+
+["foo", "bar", "baz"].map do |i|
+  i
+end
+
 ["foo", "bar", "baz"].map do |i|
   i.upcase
 end
  

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

原始问题......

我在Mac OSX上使用Git 2.9

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

$ mkdir git-highlight && cd git-highlight
$ touch foo.rb

我添加并提交以下内容:

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

现在我修改文件以包含以下内容:

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

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

如果我要运行git diffgit 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

如果您从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

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

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

[diff]
  compactionHeuristic = true

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

2 个答案:

答案 0 :(得分:11)

说到" git diff压缩启发式工作不起作用" ... Git 2.12(2017年第1季度)将退出启发式
Git 2.14 will set the indent heuristic instead as the default one

  

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

commit 3cde4e0Junio C Hamano (gitster)(2016年12月23日) 建议:Jeff King (peff)
Junio C Hamano -- gitster --于2017年1月10日commit 2ced5f2合并)

详情:

diff:退休"压缩"试探法

  

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

     

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

     

退休"压缩",并保持"缩进"作为一个实验性特征   希望后者在未来版本中默认启用,但这应该作为一个单独的步骤完成。

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

commit bab7614Carlos Martín Nieto (carlosmn)(2017年10月29日) Junio C Hamano -- gitster --合并于commit 662ac3b,2017年11月6日)

  

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

     

这个启发式一直是2.14以来的默认值,所以我们不应该混淆我们的   用户说它是实验性的并默认关闭。

注意:" git diff --indent-heuristic"有一个糟糕的角落案例表现,修正于Git 2.19(2018年第三季度)。

commit 301ef85Stefan Beller (stefanbeller)(2018年7月27日) (由Junio C Hamano -- gitster --合并于commit 791ad49,2018年8月17日)

  

xdiff:减少缩进启发式开销

     

如果我们更多地滑动一个大块,请跳过搜索更好的缩进启发式方法   比它的大小。
  这是最简单的修复proposed in the analysis,以响应mercurial为xdiff限制按常量搜索的补丁。
  使用性能测试:

#!python
open('a', 'w').write(" \n" * 1000000)
open('b', 'w').write(" \n" * 1000001)
     

这个补丁减少了" git diff --no-index a b"的执行。从   0.70秒至0.31秒。然而,限制滑动到差异大小的大小,   这是一个解决方案(我发现最容易实现)   现在)对于以下情况不是最佳的:

open('a', 'w').write(" \n" * 1000000)
open('b', 'w').write(" \n" * 2000000)
     然后我们仍然会滑动1000000次。

     

除了限制滑动到大块的大小外,还限制了一个常数。选择100行作为常量,因为它不仅仅适合屏幕,   这实际上意味着差异滑动可能不会提供太多   无论如何都是有益的。

答案 1 :(得分:3)

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

  

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

该描述明确指出git diff hunks 向上移动直到空行。第1行上方没有空白行;如果有的话,那就足够了。 (它可能需要更多的“上方”背景 - 这不一定是空白的 - 因为规范是包括上下三行背景,并且从简要描述中不清楚“向上移动”是否会受到阻碍缺乏额外的界限。)