2012-11-19 42 views
20

git命令很好地显示文件重命名历史的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

%H是长试'%h'较短提交哈希值。 编辑: 而你是对的'%F'不存在,但'%f'确实存在。 –

回答

16

您可以简化它有点像这样:

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

,这将给你输出有点像这个

621175c4998dfda8da 

README.md 
d0d6ef0a3d22269b96 

README.md 

这应该更容易解析。例如,您可以使用定点和sed出这样的新行:

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?,其中有我基于该位的答案。

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 
0

这个工作在OSX终端:

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