【问题标题】:Retrieve a list with short commit messages for each file检索包含每个文件的简短提交消息的列表
【发布时间】:2020-10-09 10:26:37
【问题描述】:

我尝试使用提交短消息(上次更改时的提交)、日期和作者姓名来检索存储库中每个文件的列表。它应该看起来像在 github 上:

我已经试过了

for file in */*; do    
    echo $f $(git log --pretty=format:"%an %s" -- $f)
done

我的存储库的运行时间约为 20 秒。那是减速的方式。该存储库仅包含大约 500 个文件。它也必须适用于 16k 文件的存储库。 因此,我只是尝试:

git log --pretty=format:"%an %s" -- */*

这会打印 repo 中的每个提交,经过时间约为 0.5 秒。性能不错,但我找不到在提交中打印更改文件的方法。

我已经阅读了有关格式的信息,但找不到有用的东西。

想法?

我在我的系统上使用 git 2.14。

【问题讨论】:

    标签: bash git shell


    【解决方案1】:

    添加原始标志还将显示与每个提交关联的文件。然后,您可以将输出通过管道传输到 awk 以仅列出文件名而不是文件名以及文件模式等

    git log --raw --pretty=format:"%an %s" | awk '!/^:/ {print $0 } /^:/ { print $6 }'
    

    要获取与每个文件关联的提交消息,请使用:

    git log --raw --pretty=format:"%an %s %f" | awk '!/^:/ {mess=$0 } /^:/ { fils[$6]=mess } END { for ( i in fils ) { print i" - "fils[i]} }'
    

    在这里,我们使用 awk 将提交消息放入由文件名索引的数组中。

    【讨论】:

    • 太好了,这几乎是我所需要的。我必须自己找到文件的最后提交消息吗?
    • 您的意思是--name-only 而不是--raw 加上awk? ;)
    • @Mike 我在答案中添加了第二部分,以显示与每个文件关联的最后一次提交。
    • 非常感谢,效果很好。我只需要看看awk。 @j6t --name-only 也可以。
    【解决方案2】:

    您也可以尝试使用--compact-summary 选项:

    git log --compact-summary
    

    来自documentation

    --compact-summary
    输出扩展头信息的简明摘要,例如文件创建或删除(“new”或“gone”,如果是符号链接,则可选“+l”)和模式更改(“+x”或“-x”用于添加或删除diffstat 中的可执行位)。信息放在文件名部分和图形部分之间。隐含--stat。

    【讨论】:

    • --compact-summary 是在 2.17 版中引入的。我不能使用它。并且文档的链接指向 C 上的本地文件:
    猜你喜欢
    • 2010-09-07
    • 2017-03-18
    • 2021-09-09
    • 1970-01-01
    • 2012-10-07
    • 2017-10-12
    • 1970-01-01
    相关资源
    最近更新 更多