Git责备-M:意外行为

Git责备-M:意外行为,git,blame,Git,Blame,当使用git-M来检测一个文件中的代码移动时,我得到了无法解释的结果 首先,我提交以下文件(file.cpp): 然后我通过移动第一行中的内容并添加新内容来修改它: 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 modif

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

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

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

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选项,空格应该不重要。

(3年后)

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

这可能与最近(2016年7月)升级的git 2.10的一个修复错误有关:

参见(2016年5月28日)作者。
(于2016年7月19日被合并)

责怪
:查找带有
-M的移动行时需要0个上下文行
git-M
的核心部分需要1行上下文,但是 准则中没有任何理由;它会产生伪影 就像在中讨论的那样

函数
diff\u hunks
diff
引擎的包装器。
将上下文长度显式地放入此包装器(而不是不传递参数,而是在 函数)明确表示有人希望用 不同的价值观

文件中没有关于原因的文件或理由 我记得。
也许它会崩溃,或者以无限循环结束。也许它可以在某个时间点这样做,但现在不会了

不确定它是否有用,但似乎又添加了
ctxlen=1

似乎不检测单线运动是每个设计,只是文件不准确 关于这个。这样的增强是否可以视为功能要求

对之前选择的历史有了更多的了解

唯一的一点是,我们为什么会想到非零上下文 这是个好主意,我说:

为了通过“
ciff
”算法更好地识别拷贝源,我们可能需要使用一些周围的上下文行,但这只是一个次要的实现细节

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;}