git blame自动删除文件

时间:2016-01-14 11:07:04

标签: git git-rm git-blame

如何在先前已删除的文件(使用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

会自动检查存储库中包含该名称的文件的整个历史记录。

2 个答案:

答案 0 :(得分:4)

您可以随时为此创建自己的bash功能:

blame-deleted () {
    git blame $(git rev-list -n 1 HEAD -- $1)~1 -- $1
}

将它添加到你的.bashrc就行了,你可以这样做:

% blame-deleted a

答案 1 :(得分:0)

您可以获得包含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'