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"
)以找到您要查找的内容。
答案 0 :(得分:17)
您可以稍微简化一下:
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调用的信息,请参阅How can I replace a newline (\n) using sed?,其中包含我所依据的答案。
答案 1 :(得分:14)
--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
答案 2 :(得分:0)
这适用于OSX终端:
git log --format='%%%h' --name-only --follow -- README.md | xargs echo | perl -pe 's/\%/\n/g'