当使用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选项,空格无关紧要。
答案 0 :(得分:1)
(3年后)
我想知道为什么包含
func1()
的行未被识别为已移动。
这可能与最近(2016年7月)修复git 2.10的固定错误有关:
commit 17a07e2见David Kastrup (fedelibre
)(2016年5月28日)
(由Junio C Hamano -- gitster
--合并于commit 7418a6b,2016年7月19日)
的移动行时需要0个上下文行
blame
:在查找带有-M
git blame -M
的核心部分需要1个上下文行,但是 在代码中找不到任何理由;它会导致伪影 就像that thread "Understanding behavior ofgit blame -M
"中所讨论的那样。函数
diff_hunks
是diff
引擎的包装器 将上下文长度显式地放入这个包装器中(而不是传递一个参数,而只是将上下文长度设置为零 功能)清楚地表明某人想要它被调用 不同的价值观。文件 why 中没有文档或基本原理 我记得。
也许它会崩溃或最终陷入无限循环。也许它可以在一个时间点这样做,但不再这样做。不确定是否有帮助,但
ctxlen = 1
似乎会在d24bba8 (git-pickaxe -M
: blame line movements within a file)中添加{。}}。似乎没有检测单线移动是按设计进行的,只是文档不准确 对这个。是否可以将此类增强视为功能请求?
This thread更多地了解了之前选择的历史。
唯一能够远程暗示我们为什么认为非零背景的事情 是一个好主意was this,其中我说:
我们可能需要使用少数周围的上下文行来通过“
ciff
”算法更好地识别复制源,但这是一个次要的实现细节。