$ pwd
/data/mdi2/classes
$ git blame -L22,+1 -- utils.js
99b7a802 mdi2/utils.js (user 2015-03-26 21:54:57 +0200 22) #comment
$ git blame -L22,+1 99b7a802^ -- utils.js
fatal: no such path mdi2/classes/utils.js in 99b7a802^
如您所见,该文件位于该提交的不同目录中
$ git blame -L22,+1 99b7a802^ -- ../utils.js
c5105267 (user 2007-04-10 08:00:20 +0000 22) #comment 2
尽管在文档中
The origin of lines is automatically followed across whole-file renames (currently there is no option to turn
the rename-following off)
责备不跟随重命名。为什么?
更新:简短的回答
git blame
跟随重命名,但不为git blame COMMIT^ -- <filename>
但这很难通过大量重命名和大量历史记录手动跟踪文件重命名。我认为,必须修复此行为以静默地跟随git blame COMMIT^ -- <filename>
. 或者,至少,--follow
必须实施,所以我可以:git blame --follow COMMIT^ -- <filename>
更新2:那是不可能的。参见下文。
Junio C Hamano 来自邮递员的答复
git blame
跟随重命名,但不为git blame COMMIT^ -- <filename>
假设您的 v1.0 版本中有文件 A 和文件 B。
六个月后,代码被重构了很多,你不需要单独的这两个文件的内容。您已经删除了 A 和 B,它们的大部分内容现在都在文件 C 中。这就是当前状态。
git blame -C HEAD -- C
可以遵循两者的内容就好了,但如果你被 允许说
git blame v1.0 -- C
这甚至意味着什么?C 根本不存在 v1.0。您是要按照当时A的内容还是B的内容?当你在这个命令中告诉它 C 时,你是如何告诉你的意思是 A 而不是 B?
“git blame”跟随内容运动,从不以任何特殊方式对待“重命名”,因为认为重命名有某种特殊性是一件愚蠢的事情;-)
从命令行告诉从什么内容开始挖掘到命令的方式是给出起点提交(默认为 HEAD,但您可以给出 COMMIT^ 作为您的示例)和该起点的路径。因为将 C 告诉 Git 并神奇地让它猜测您在某些情况下是 A 而在其他情况下是 B 是没有任何意义的。如果 v1.0 没有 C,唯一明智的做法是退出而不是猜测(并且不告诉用户它是如何猜测的)。