$ pwd
/data/mdi2/classes
$ git blame -L22,+1 -- utils.js
99b7a802 mdi2/utils.js (user 2015-03-26 21:54:57 +0200 22) #comment
$ git blame -L22,+1 99b7a802^ -- utils.js
fatal: no such path mdi2/classes/utils.js in 99b7a802^
お気づきのとおり、ファイルはそのコミットの別のディレクトリにありました
$ git blame -L22,+1 99b7a802^ -- ../utils.js
c5105267 (user 2007-04-10 08:00:20 +0000 22) #comment 2
ドキュメントにもかかわらず
The origin of lines is automatically followed across whole-file renames (currently there is no option to turn
the rename-following off)
非難は名前変更に従いません。なんで?
更新:短い答え
git blame
名前の変更に従いますが、git blame COMMIT^ -- <filename>
しかし、大量の名前変更と大量の履歴を介して手動でファイルの名前変更を追跡するのは非常に困難です。の名前変更を黙って追跡するには、この動作を修正する必要があると思いますgit blame COMMIT^ -- <filename>
。または、少なくとも--follow
実装する必要があるため、次のことができます。git blame --follow COMMIT^ -- <filename>
UPDATE2:それは不可能です。以下をお読みください。
メールリストからの回答by Junio C Hamano
git blame
名前の変更に従いますが、git blame COMMIT^ -- <filename>
バージョン v1.0 にファイル A とファイル B があるとします。
6 か月後、コードは大幅にリファクタリングされたので、これら 2 つのファイルの内容を個別に取得する必要はありません。あなたは A と B を削除し、それらが持っていたものの多くは現在ファイル C にあります。それが現在の状態です。
git blame -C HEAD -- C
内容はどちらからでもいいのですが 、言わせてもらえば
git blame v1.0 -- C
それはどういう意味ですか?C は v1.0 ではまったく存在しませんでした。当時のAの内容を踏襲するか、Bの内容を踏襲するか。このコマンドで C と言ったとき、B ではなく A を意味しているとどのように言いましたか?
「git Blame」はコンテンツの移動に従い、「名前の変更」を特別な方法で扱うことは決してありません。
コマンド ラインからどのコンテンツから掘り始めるかをコマンドに伝える方法は、開始点 commit (デフォルトは HEAD ですが、例として COMMIT^ を指定することもできます) とその開始点のパスを指定することです。C を Git に伝えてから、魔法のように A を意味する場合もあれば、B を意味する場合もあると推測させるのは意味がないためです。v1.0 に C が含まれていない場合、唯一賢明なことは、推測を行う代わりに終了することです (そして、ユーザーにどのように推測したかを伝えません)。