2015-09-24 3 views
1

Каков формат аргумента revs-file для git blame -S?Как использовать git blame -S <revs-file>

Я попытался запустить его с выходом git rev-list следующим образом, но вину присваивает каждую строку HEAD фиксации.

git blame -S <(git rev-list HEAD~50 HEAD) $file

Я также попытался запустить <(git rev-list ... | tac) переломить revs-file в случае, когда была проблема, но она, кажется, производит тот же результат.

Цель состоит в том, чтобы обвинить каждую линию $file к фиксации между HEAD~50 и HEAD, по умолчанию HEAD~50 если та же линия присутствует во всех фиксаций.

+0

'git rev-list HEAD ~ 50 HEAD' выводит то же, что и' git rev-list HEAD'. Вы намеревались использовать 'git rev-list HEAD ~ 50..HEAD'? Если это так, здесь важны две точки. – torek

ответ

1

Если каждая строка приписывается последнему фиксации, это означает, что каждая строка была фактически затронута последней фиксацией.

Обычно такое происходит, когда кто-то меняет каждую строку, заканчивающуюся от одной новой строки до пары 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.)

+0

Все '\ n', и мне удалось получить разные результаты, используя' git wame $ file | при чтении строки; do grep "$ (echo -n '^'; echo" $ line "| sed -E 's/^ \ ^?([a-f0-9] {7,8}). * $/\ 1/g ') "<(git rev-list HEAD ~ 50 HEAD)>/dev/null && echo" $ line "; done' – arcyqwerty