2014-03-02 284 views
6

我想要一个具有交错行的差异,即“hunk”不超过一行。git diff with interleaved lines

例如,而不是

-t1 = "Christmas 2013" 
-t2 = "Easter 2013" 
-t3 = "Thanksgiving 2013" 
+t1 = "Christmas 2014" 
+t2 = "Easter 2014" 
+t3 = "Thanksgiving 2014" 

我想这一点:

-t1 = "Christmas 2013" 
+t1 = "Christmas 2014" 
-t2 = "Easter 2013" 
+t2 = "Easter 2014" 
-t3 = "Thanksgiving 2013" 
+t3 = "Thanksgiving 2014" 

到目前为止,我有

git diff -U0 --ignore-space-at-eol before after holidays.ini 

我已尝试设置--break-rewrites=0%/0%--break-rewrites=100%/0%等,但它没”不会改变任何东西(我甚至不知道它是否与我的问题有关)。

回答

0

没有任何内置的差异算法会以这种方式表现。

我很好奇你想看看如果改变是增加一行和替换两个,所以(抓住你的例子)你会有这样的事情:

-t1 = "Christmas 2013" 
+t1 = "Christmas 2014" 
+t2 = "Easter 2014" 
-t3 = "Thanksgiving 2013" 
+t3 = "Thanksgiving 2014" 

这里,对于t2,没有什么可删除的。

无论如何,我相信你最好的选择可能是后处理输出git diff -U0

如果你是一个Unix的十岁上下的系统,你也可以使用原始的,非统一差异,例如:

$ diff --git a/like_min.py b/like_min.py 
index 05b9a4d..1c90084 100644 
--- a/like_min.py 
+++ b/like_min.py 
@@ -1 +1 @@ 
-def like_min(iterable, key=None): 
+def like_min(iterable, key=None): # comment 
@@ -9 +9 @@ def like_min(iterable, key=None): 
- for candidate in it: 
+ for candidate in it: # another comment 
$ git show HEAD:like_min.py | diff - like_min.py 
1c1 
< def like_min(iterable, key=None): 
--- 
> def like_min(iterable, key=None): # comment 
9c9 
<  for candidate in it: 
--- 
>  for candidate in it: # another comment 

这可能是更容易进行后处理(这取决于很多细节)上。特别是每个更改都以行号和字母代码开始(a dd,c hange,d elete),因此不需要确定是纯粹添加还是纯粹删除,还是需要分割更改一次一行。您还可能需要开启一个“变”成“改变,然后添加或 - 删除”如果行数不匹配:

$ git show HEAD:like_min.py | diff - like_min.py 
1c1,2 
< def like_min(iterable, key=None): 
--- 
> def like_min(iterable, key=None): # comment 
> def like_min(iterable, key=None): # comment 
9c10 
<  for candidate in it: 
--- 
>  for candidate in it: # another comment 

另外,“老差异”可能有不同的(而不是期望的)空白忽略选项。


--break-rewrites摆弄你想要的是正交的:它只是改变了在该混帐认为文件为“完全重写”的地步,从而显示其更改为“删除所有以前的文件内容,插入清一色新内容“。

根据文档-B50%/60%,默认断点指定不能超过60%的文件可以被“重写”,或者等同于“至少40%的文件仍然匹配”。你可能想减少这个,但可能不想增加它。 (顺便说一下,我似乎无法将其设置为0%;将其设置为1%会使大部分更改变为完整的重写,但是很小的更改(例如只更改文件的一行)仍显示为小的更改,而不是总文件这可能是因为相似性指数并非完全基于一次一行的变化,而是还包括行内匹配。)

(第一个数字 - 即-B50%/60%中的50% - 是假定重命名检测被启用,用于重命名检测的相似性索引值。将这两个数字看作“相似性和相异性指数”的值:相似性指数是“文件1与文件2的接近程度”,不相似度仅为100%减去相似度。)

0

如果差异不是必需的是文本,你可以使用KDiff3

KDiff3 screenshot

这会给出一个比单行更大的粒度。