Git blame删除的文件,自动化

3

如何在文件被删除(使用 git rm)后运行 git blame 是一个常见的问题。如果您只是使用旧文件名运行它,则会产生与从未存在过的文件相同的错误:

% 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 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个回答

4
您可以始终为此创建自己的bash函数:
blame-deleted () {
    git blame $(git rev-list -n 1 HEAD -- $1)~1 -- $1
}

将这段代码添加到你的 .bashrc 文件中即可实现该功能,之后你可以这样做:
% blame-deleted a

谢谢,git rev-list 很有用。它不能显示已重命名文件的所有修订版本 - 给出新名称只显示重命名之前的修订版本 - 但它确实可以让您查看已删除的修订版本。 - Ed Avis

0

您可以使用git log命令获取包含该文件的最新版本:

git log --pretty=%H --diff-filter=AM -1 -- path

而且git blame会跟踪更改:

行的来源在整个文件重命名中自动跟踪(目前没有关闭重命名跟踪的选项)。要跟踪从一个文件移动到另一个文件的行,或者跟踪从另一个文件复制和粘贴的行等,请参见-C和-M选项。

因此,可以创建一个自动查找的别名 autoblame。

git config alias.findandblame \
        '!f() { git blame $(git log --pretty=%H --diff-filter=AM -1 -- "$1") -- "$1"; }; f'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接