$ 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^
Как вы заметили, файл находился в другом каталоге в том, что commit
$ git blame -L22,+1 99b7a802^ -- ../utils.js
c5105267 (user 2007-04-10 08:00:20 +0000 22) #comment 2
Несмотря на doc
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: Это невозможно. Читайте ниже.
ОТВЕТ ОТ MAILLIST от Юнио С Хамано
git blame
следует переименовывать, но не дляgit blame COMMIT^ -- <filename>
Предположим, что у вас есть файл A и файл B в версии v1.0.
Шесть месяцев по дороге, код был значительно реорганизован, и вы делаете не нужно содержимое этих двух файлов отдельно. У тебя есть удалены A и B, и большая часть того, что у них есть, теперь находится в файле C. Это текущее состояние.
git blame -C HEAD -- C
может следить за содержимым от обоих просто отлично, но если вы были позволили сказать
git blame v1.0 -- C
что это значит? C вообще не существовало v1.0. Ты прося следовать за содержимым A тогда, или B? Как ты скажите, что вы имели в виду A, а не B, когда вы сказали это C в этой команде?
"git винить" следует за движениями содержимого и никогда не обрабатывает "переименования" в любой особый способ, поскольку глупо, чтобы думать о переименовании как-то особенное; -)
Как вы расскажете, какой контент начать копать в команде из командной строки - дать отправку отправной точки (по умолчанию HEAD, но вы можете дать COMMIT ^ в качестве своего примера) и путь в этом отправная точка. Поскольку нет смысла указывать C на Git и то волшебным образом предположим, что вы имели в виду A в некоторых случаях и B в некоторых Другие. Если у v1.0 не было C, единственная разумная вещь - это выйдите вместо того, чтобы сделать предположение (и не сообщая пользователю, как это догадался).