【问题标题】:git blame deleted file, automaticallygit blame 删除文件,自动
【发布时间】:2016-04-19 16:29:36
【问题描述】:

如何在之前删除的文件上运行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

这将自动检查存储库的整个历史记录以查找具有该名称的文件。

【问题讨论】:

    标签: git git-rm git-blame


    【解决方案1】:

    您总是可以为此创建自己的 bash 函数:

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

    将其添加到您的 .bashrc 即可解决问题,您可以这样做:

    % blame-deleted a
    

    【讨论】:

    • 谢谢,git rev-list 很有用。它不会显示已重命名文件的所有修订 - 提供新名称仅显示重命名之前的修订 - 但它确实允许您查看已删除的文件。
    【解决方案2】:

    您可以使用git log 获取文件的最后一个版本:

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

    git blame 确实会跟随变化:

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

    所以一个 dig-it-out-wherever-it-is autoblame 别名将是

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

    【讨论】:

      猜你喜欢
      • 2019-08-18
      • 2019-12-20
      • 2019-03-19
      • 2017-11-19
      • 1970-01-01
      • 2012-03-06
      • 1970-01-01
      相关资源
      最近更新 更多