22

git命令_

git log --format='%H' --follow -- foo.txt

将为您提供 touch 的一系列提交,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") 以找到您要查找的内容。

4

3 回答 3

20

您可以像这样简化它:

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 调用的信息,请参阅如何使用 sed 替换换行符 (\n)?这有我基于该位的答案。

于 2012-11-29T06:40:12.107 回答
15

--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
于 2012-11-27T07:37:02.227 回答
0

这适用于 OSX 终端:

git log --format='%%%h' --name-only --follow -- README.md | xargs echo | perl -pe 's/\%/\n/g'
于 2016-05-29T20:04:41.230 回答