在git日志中很好地显示文件重命名历史记录

在git日志中很好地显示文件重命名历史记录,git,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 --

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”
),以找到您要查找的内容。

--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 one liner就可以做到这一点(它在Windows上按原样工作。在Linux上,使用单引号或escape
$
\$
):


您可以将其简化如下:

git log --format='%H' --name-only --follow -- 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
这应该更容易解析。例如,您可以使用sentinel并按如下方式显示换行符:

git log --format='%H' --name-only --follow -- 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调用的信息,请参阅哪个具有基于该位的答案。

这适用于OSX终端:

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

%H是长时间尝试
%H
以获得较短的提交哈希。编辑:您是对的
%F
不存在,但
%F
存在。