常见的问题,如何在之前被删除的文件上运行git blame
(带有git rm
)。 如果您只是使用旧文件名运行它,那么它会给出与从未存在过的文件相同的错误:
% git init
% echo 1 >a
% git add a
% git commit -m.
% echo 2 >a
% git add a
% git commit -m.
% git rm a
% git commit -m.
% git blame a
fatal: cannot stat path 'a': No such file or directory
% git blame z
fatal: cannot stat path 'z': No such file or directory
(git 打印的对早期命令的响应已被省略,以保持简洁。
一种常见的解决方案是查看git log --stat
以查找删除文件的修订版。 然后,您可以将该修订的父级传递给git blame
:
% git blame 11144~1 -- a
97da6499 (Ed Avis 2016-01-14 11:00:40 +0000 1) 2
这有效,但像这样手动搜索日志很麻烦。 有没有办法告诉 git "我想查看过去任何修订版中曾经被称为a
的文件"? 我希望像这样简单明了的东西
% git blame --any-file-named a
这将自动检查存储库的整个历史记录以查找具有该名称的文件。
你总是可以为此制作自己的bash函数:
blame-deleted () {
git blame $(git rev-list -n 1 HEAD -- $1)~1 -- $1
}
将其添加到您的 .bashrc 中将起到作用,因此您可以执行以下操作:
% blame-deleted a
您可以获得具有 git log
文件的最后一个修订版:
git log --pretty=%H --diff-filter=AM -1 -- path
git blame
确实遵循以下方面的变化:
行的原点在整个文件重命名中自动遵循(目前没有关闭重命名的选项)。要跟踪从一个文件移动到另一个文件的行,或跟踪从另一个文件复制和粘贴的行等,请参阅 -C 和 -M 选项。
所以一个挖出来的地方是自责
别名git config alias.findandblame
'!f() { git blame $(git log --pretty=%H --diff-filter=AM -1 -- "$1") -- "$1"; }; f'