красиво отображать историю переименования файлов в git log

git команда

git log --format='%H' --follow -- foo.txt

даст вам серию коммитов, которые касаютсяfoo.txt, следуя за этим через переименования.

мне интересно, если естьсgit log Команда, которая также напечатает соответствующее историческое имя файла рядом с каждым коммитом.

Это было бы что-то вроде этого, где мы можем интерпретировать'%F' быть (на самом деле не существует) заполнителем для имени файла.

git log --format='%H %F' --follow -- foo.txt

Я знаю, что это может быть достигнуто с

git log --format='%H' --follow --numstat -- foo.txt

но вывод не идеален, так как требует некоторого нетривиального анализа; каждый коммит разбросан по нескольким строкам, и вывсе равно нужно будет разобрать синтаксис переименования файлов ("bar.txt => foo.txt") чтобы найти то, что тыищу.

 Dahir Warsame27 нояб. 2012 г., 14:13
% H это долго пытаться%h для более короткого хэша. РЕДАКТИРОВАТЬ: И вы правы%F Безразлично»не существует, но%f делает.

Ответы на вопрос(3)

--name-status должен работать на вас:

git log --follow --name-status --format='%H' -- foo.txt

Результат будет выглядеть следующим образом и может быть легко проанализирован Perl или Python:

'4da4d5e3e9c24251e14d20004a853b72bd096cce'

R100    b.txt   c.txt
'4966238c97198d096f0424a0a23ec550297d8086'

M       b.txt
'c0e41c11f0f7c5a7650cedfbad138c8941444023'

R100    a.txt   b.txt
'4b2318c0fbabd836d50cabd70bf19013d3964856'

A       a.txt

Если вы настаиваете, чтобы это было в одну строку, этот Perl-однострочный делает свое дело (он работает в Windows как есть. В Linux используйте одинарные кавычки или экранируйте$ как\$):

git log --follow --name-status --format='%H' -- c.txt | perl -e "while(){chomp;print;;$_=;print q/ /,((split/\t/)[-1]);}"

который печатает:

'4da4d5e3e9c24251e14d20004a853b72bd096cce' c.txt
'4966238c97198d096f0424a0a23ec550297d8086' b.txt
'c0e41c11f0f7c5a7650cedfbad138c8941444023' b.txt
'4b2318c0fbabd836d50cabd70bf19013d3964856' a.txt
Решение Вопроса

Вы можете упростить это немного так:

git log --format='%H' --name-only --follow -- README.md

который даст вам вид вроде этого

621175c4998dfda8da

README.md
d0d6ef0a3d22269b96

README.md

который должен быть немного легче разобрать. Например, вы можете использовать часовой и вывести символы перевода строки следующим образом:

git log --format='%H%%' --name-only --follow -- README.md | sed ':a;N;$!ba;s/%\n\n/ /g'

который должен дать вам хэш и имя файла в одной строке:

621175c4998dfda8da README.md
d0d6ef0a3d22269b96 README.md

Для получения информации о вызове sed см.Как заменить символ новой строки (\ n) с помощью sed? который имеет ответ, на котором я основал этот бит.

Это работает в терминале OSX:

git log --format='%%%h' --name-only --follow -- README.md | xargs echo | perl -pe 's/\%/\n/g'

Ваш ответ на вопрос