Красиво отображать историю переименования файлов в 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"
) чтобы найти то, что вы ищете.
3 ответа
Вы можете упростить это немного так:
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? который имеет ответ, на котором я основал этот бит.
--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
Это работает в терминале OSX:
git log --format='%%%h' --name-only --follow -- README.md | xargs echo | perl -pe 's/\%/\n/g'