3

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

これは機能しますが、このようにログを手動で検索するのは面倒です。agitに「過去のリビジョンで呼び出されていたファイルを調べたい」と伝える方法はありませんか? 私は次のような簡単なものを望んでいます

% git blame --any-file-named a

その名前のファイルのリポジトリの履歴全体を自動的にチェックします。

4

2 に答える 2

4

このために、いつでも独自の bash 関数を作成できます。

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

それを .bashrc に追加すると、トリックが実行されるので、次のことができます。

% blame-deleted a
于 2016-03-18T03:59:24.243 に答える
0

次のファイルを含む最後のリビジョンを取得できます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'
于 2017-01-05T01:06:40.577 に答える