Если каждая строка приписывается последнему фиксации, это означает, что каждая строка была фактически затронута последней фиксацией.
Обычно такое происходит, когда кто-то меняет каждую строку, заканчивающуюся от одной новой строки до пары CR/LF, или наоборот.
Ага, выше будет верно без-S
, но что -S
означает для git blame
, это вставить трансплантатов минуте фиксации графика.
Это специальная функция, предназначенная для работы с cvsserver (согласно комментариям), но она не работает с тем, как вы ее используете.
Формат - это просто серия из <commit-ID> <parent-ID> ...\n
линий. Так как в этом случае, вы хотите начать git blame
в HEAD
и остановить его на HEAD~50
, мы можем сделать это:
git rev-parse HEAD~50 | git blame -S /dev/stdin $file
git rev-parse
выводит SHA-1 на фиксацию HEAD~50
, без дополнительных линий, что делает что commit не имеют родительских фиксаций (-ов), что делает git blame
прекратить обход истории в этой точке.
(Команда, которую вы использовали для подачи -S
входа, git rev-list HEAD~50 HEAD
, перечисляет каждый совершают достижимыми из HEAD~50
или от HEAD
, так как только один совершить ID, опуская родитель. Это то же самое, как git rev-list HEAD
, так HEAD~50
сам по себе может достигать HEAD
.Поскольку в этом списке перечислены любые фиксации без родительских идентификаторов, это сделало git blame
относиться к каждой фиксации как к корневой фиксации. Затем он начал с фиксации HEAD
, попытался найти своих родителей, считая, что HEAD
является корневой фиксацией, и остановились там, что сделало ответственным за каждую исходную строку. er, путем перечисления идентификатора фиксации HEAD
, вы получили git blame
, чтобы остановиться там. Вот почему мы хотим перечислить вместо этого HEAD~50
.)
'git rev-list HEAD ~ 50 HEAD' выводит то же, что и' git rev-list HEAD'. Вы намеревались использовать 'git rev-list HEAD ~ 50..HEAD'? Если это так, здесь важны две точки. – torek