有没有办法告诉git给我移动文件中一行的提交



我有一个显示堆栈跟踪的日志。堆栈跟踪中的每一行都显示调用的函数、文件名和行号。

问题是,这些与它应该的构建不一致。所以,我需要知道函数是何时从当前位置移动到过去的位置的。

例如

System.NullReferenceException: Object reference not set to an instance of an object.
at ns1.ns2.cn.fn2(t1 p1, t2 p2) in c:pathfile2.cs:line 456
at ns1.ns2.cn.fn1(t1 p1, t2 p2) in c:pathfile1.cs:line 123
...

在这种情况下,过去调用了ns1.ns2.cn.fn1(t1 p1, t2 p2),它在文件c:pathfile1.cs的第123行调用了另一个函数ns1.ns2.cn.fn2(t1 p1, t2 p2)

然而,目前,该行位于223行,比CCD_5低100行。

有没有办法告诉git告诉我223之前什么时候添加了行,这使它减少了100行?

我发现的最快的方法是制作一个脚本来查看文件的所有不同版本:

$  export file="path_from_repo_root/file1.cs";
git log --pretty=short -u -L 1,99999999:"$file"|perl -e '
use warnings;
use strict;
my ($linesAdded, $linesDeleted) = (0, 0);
while (<>) {
if (/^commit ([a-f0-9]+)/ and !eof()) {
my $linesDiff = ($linesAdded - $linesDeleted);
print;  # prints commit hash
if ($linesDiff) {
system("git show $1:$ENV{file} | grep -n --color=always fn2");
}
($linesAdded, $linesDeleted) = (0, 0);
} elsif (/^-/ ) {
++$linesDeleted;
} elsif (/^+/) {
++$linesAdded;
}
}' | less -R

如果文件中的行数发生了变化,它将吐出文件中的所有提交哈希以及函数在文件中的位置。

请注意,这不是一个完美的解决方案,但它足够好,可以找到我需要的东西。此外,99999999可能已经更改为函数当前所在的行(我想),但我不确定,所以我基本上只是说查看整个文件。

您可以使用与";鹤嘴锄;(-S<regex>),它将向您显示添加、删除匹配行或两者的所有更改,这正是您所需要的。(与-S不同,它不会跳过提交前后匹配数量相同的情况。)

这不会缩小到只有的移动,但通常应该足以找到你需要的。

最新更新