如何在文件的特定修订版中获取源代码行号?

How to get source line numbers in a specific revision of a file?

可以看到 source/original 行号 git blame 但它显示行号根据到在行

中进行修改的最后一次提交

我想对文件的特定 commit/revision 执行相同的操作。

示例,

文件:file.extxyz11 是我们当前正在查看的文件的 revision/commit)

内容:

Line 1 (**abc11** is the last commit changed this line)
Line 2 (**abc12** is the last commit changed this line)
Line 3 (**abc13** is the last commit changed this line)

我想为 "Line 3" 获取 "3"。 Git blame 将根据 行的提交 (abc13) 提交显示此信息。但是,由于 xyz11abc13 修订包含不同的内容,因此 xyz11 中的实际行号可能不同.

那么如何获取文件特定修订版中的行号?

注意:我说 "source/original line number" 因为我想获得正确的行号,即使文档很脏(有未提交的更改)也可以使用 git blame

我的方案是,我将在 API 请求中使用这些行号来添加内联评论

所以,假设我修改了 file.ext

Line 1
Line 2
Uncommited Line 
Uncommited Line
Line 3

我应该静止不动 "3" 因为 "Line 3" 而不是 "5",否则注释会跑错行。正如我所说,它可能与 git blame 但它根据行的提交显示此信息

谢谢

如果我没理解错的话,你有一个包含未提交更改的文件,你的 git blame 看起来像这样。

$ git blame foo

^592c0a1 (Michael G. Schwern 2019-01-01 12:56:35 -0800 1) Line 1
^592c0a1 (Michael G. Schwern 2019-01-01 12:56:35 -0800 2) Line 2
00000000 (Not Committed Yet  2019-01-01 12:58:04 -0800 3) Uncommitted Line
00000000 (Not Committed Yet  2019-01-01 12:58:04 -0800 4) Uncommitted Line
^592c0a1 (Michael G. Schwern 2019-01-01 12:56:35 -0800 5) Line 3

使用 -n 显示它在原始提交中的哪一行。

$ git blame -n foo

^592c0a1 1 (Michael G. Schwern 2019-01-01 12:56:35 -0800 1) Line 1
^592c0a1 2 (Michael G. Schwern 2019-01-01 12:56:35 -0800 2) Line 2
00000000 3 (Not Committed Yet  2019-01-01 12:58:47 -0800 3) Uncommitted Line
00000000 4 (Not Committed Yet  2019-01-01 12:58:47 -0800 4) Uncommitted Line
^592c0a1 3 (Michael G. Schwern 2019-01-01 12:56:35 -0800 5) Line 3

要忽略所有未提交和未暂存的更改,请使用 git blame <file> HEADHEAD 是最后一次提交。这将从 HEAD 向后查找对文件的所有更改。因为中间的提交也会丢掉行号,所以您仍然希望 -n 获得该提交中的行号。例如。

$ git blame -n foo

^592c0a1 1 (Michael G. Schwern 2019-01-01 12:56:35 -0800 1) Line 1
^592c0a1 2 (Michael G. Schwern 2019-01-01 12:56:35 -0800 2) Line 2
00000000 3 (Not Committed Yet  2019-01-01 13:03:06 -0800 3) Uncommitted line
4a87d48f 3 (Michael G. Schwern 2019-01-01 13:02:32 -0800 4) Line 2.5
^592c0a1 3 (Michael G. Schwern 2019-01-01 12:56:35 -0800 5) Line 3

$ git blame -n foo HEAD

^592c0a1 1 (Michael G. Schwern 2019-01-01 12:56:35 -0800 1) Line 1
^592c0a1 2 (Michael G. Schwern 2019-01-01 12:56:35 -0800 2) Line 2
4a87d48f 3 (Michael G. Schwern 2019-01-01 13:02:32 -0800 3) Line 2.5
^592c0a1 3 (Michael G. Schwern 2019-01-01 12:56:35 -0800 4) Line 3

有一个选项rev for git blame 所以,你可以指定你想要的commit/revision归咎于:

git blame <rev> file

例子

git blame xyz11 file.txt

更多信息在 docs