【问题标题】:nicely display file rename history in git log在 git log 中很好地显示文件重命名历史
【发布时间】:2012-11-07 00:36:56
【问题描述】:

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

【问题讨论】:

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

标签: git


【解决方案1】:

--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】:

    你可以像这样简化一点:

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

    【讨论】:

      【解决方案3】:

      这适用于 OSX 终端:

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

      【讨论】:

        猜你喜欢
        • 2011-10-08
        • 2014-06-04
        • 1970-01-01
        • 1970-01-01
        • 2021-02-03
        • 1970-01-01
        • 2023-01-30
        • 2015-04-20
        • 2015-02-04
        相关资源
        最近更新 更多