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

Jia*_*ian 22 git

git命令

git log --format='%H' --follow -- foo.txt
Run Code Online (Sandbox Code Playgroud)

将为您提供一系列提交,foo.txt在重命名后跟随它.

我想知道是否有一个git log命令也会在每次提交旁边打印相应的历史文件名.

这将是这样的,我们可以解释'%F'为文件名的(实际上不存在的)占位符.

git log --format='%H %F' --follow -- foo.txt
Run Code Online (Sandbox Code Playgroud)

我知道这可以用

git log --format='%H' --follow --numstat -- foo.txt
Run Code Online (Sandbox Code Playgroud)

但输出并不理想,因为它需要一些非平凡的解析; 每个提交都遍布多行,您仍然需要解析文件重命名语法("bar.txt => foo.txt")以找到您要查找的内容.

Foo*_*eth 19

你可以这样简化一下:

git log --format='%H' --name-only --follow -- README.md
Run Code Online (Sandbox Code Playgroud)

这将给你输出类似的东西

621175c4998dfda8da

README.md
d0d6ef0a3d22269b96

README.md
Run Code Online (Sandbox Code Playgroud)

这应该更容易解析.例如,你可以使用一个标记并将这些新行排除在外:

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

这应该给你在同一行的哈希和文件名:

621175c4998dfda8da README.md
d0d6ef0a3d22269b96 README.md
Run Code Online (Sandbox Code Playgroud)

有关sed调用的信息,请参阅如何使用sed替换换行符(\n)?我的答案基于这个答案.


mvp*_*mvp 15

--name-status 应该适合你:

git log --follow --name-status --format='%H' -- foo.txt
Run Code Online (Sandbox Code Playgroud)

结果将如下所示,可以通过Perl或Python轻松解析:

'4da4d5e3e9c24251e14d20004a853b72bd096cce'

R100    b.txt   c.txt
'4966238c97198d096f0424a0a23ec550297d8086'

M       b.txt
'c0e41c11f0f7c5a7650cedfbad138c8941444023'

R100    a.txt   b.txt
'4b2318c0fbabd836d50cabd70bf19013d3964856'

A       a.txt
Run Code Online (Sandbox Code Playgroud)

如果你坚持让它在一行中,这个Perl单线程就可以了(它可以在Windows上运行.在Linux上,使用单引号或转义$\$):

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

打印:

'4da4d5e3e9c24251e14d20004a853b72bd096cce' c.txt
'4966238c97198d096f0424a0a23ec550297d8086' b.txt
'c0e41c11f0f7c5a7650cedfbad138c8941444023' b.txt
'4b2318c0fbabd836d50cabd70bf19013d3964856' a.txt
Run Code Online (Sandbox Code Playgroud)