Git责备-M:出乎意料的行为

时间:2013-02-25 16:16:10

标签: git blame

当使用git blame -M来检测一个文件中的代码移动时,我得到的结果是我无法向自己解释的。

首先我提交以下文件(file.cpp):

void func1(){return;}[CR][LF]
int func2(){return 23;}[CR][LF]    

然后我通过移动第一行中的内容并添加新内容来修改它:

float newFunc(){return 23.0;}[CR][LF]
int func2(){return 23;}[CR][LF]
[CR][LF]
[CR][LF]
void func1(){return;}[CR][LF]

现在的日志如下所示:

>git log --oneline -2
18c670f modified file.cpp
92b4186 added file.cpp

现在我责怪:

git blame -s -w -M file.cpp
18c670fa 1) float newFunc(){return 23.0;}
92b4186d 2) int func2(){return 23;}
18c670fa 3)
18c670fa 4)
18c670fa 5) void func1(){return;}

我想知道为什么包含func1()的行不会被识别为已移动。我试图减少所需字符的数量(即-M4等)。此外,由于-w选项,空格无关紧要。

1 个答案:

答案 0 :(得分:1)

(3年后)

  

我想知道为什么包含func1()的行未被识别为已移动。

这可能与最近(2016年7月)修复git 2.10的固定错误有关:

commit 17a07e2David Kastrup (fedelibre)(2016年5月28日) (由Junio C Hamano -- gitster --合并于commit 7418a6b,2016年7月19日)

  

blame:在查找带有-M

的移动行时需要0个上下文行      

git blame -M的核心部分需要1个上下文行,但是   在代码中找不到任何理由;它会导致伪影   就像that thread "Understanding behavior of git blame -M"中所讨论的那样。

     

函数diff_hunksdiff引擎的包装器   将上下文长度显式地放入这个包装器中(而不是传递一个参数,而只是将上下文长度设置为零   功能)清楚地表明某人想要它被调用   不同的价值观。

     

文件 why 中没有文档或基本原理   我记得。
  也许它会崩溃或最终陷入无限循环。也许它可以在一个时间点这样做,但不再这样做。

     

不确定是否有帮助,但ctxlen = 1似乎会在d24bba8 (git-pickaxe -M: blame line movements within a file)中添加{。}}。

     

似乎没有检测单线移动是按设计进行的,只是文档不准确   对这个。是否可以将此类增强视为功能请求?

This thread更多地了解了之前选择的历史。

  

唯一能够远程暗示我们为什么认为非零背景的事情   是一个好主意was this,其中我说:

     
    

我们可能需要使用少数周围的上下文行来通过“ciff”算法更好地识别复制源,但这是一个次要的实现细节。