【问题标题】:git: changelog day by daygit:每天更新日志
【发布时间】:2011-02-27 22:23:19
【问题描述】:

如何生成按日期分组的提交的变更日志,格式为:

[date today]
- commit message1
- commit message2
- commit message3
...
[date day+3]
- commit message1
- commit message2
- commit message3
...
(skip this day if no commits)

[date day+1]
- commit message1
- commit message2
- commit message3
... 
[date since]
- commit message1
- commit message2
- commit message3

任何 git log 命令或智能 bash 脚本?

【问题讨论】:

  • 如果提交日期是非单调的,由于其中一位贡献者的时钟偏差/错误配置的时钟,该怎么办?

标签: git bash logging changelog


【解决方案1】:

git log--since--until,用一些东西包裹起来应该不难。

【讨论】:

    【解决方案2】:

    这肯定需要某种脚本。
    有点像commandline-fu

    for k in `git branch|perl -pe s/^..//`;do echo -e `git show --pretty=format:"%Cgreen%ci %Cblue%cr%Creset" $k|head -n 1`\\t$k;done|sort -r
    

    (不是完全你所追求的,但可以给你一个想法)

    我知道GitStats 也有按日期组织的数据(但不包括提交消息)


    注意:此命令的git branch 部分不适合编写脚本,因为Jakub Narębski cmets。
    git for-each-refgit show-ref 是脚本命令的自然候选者,管道 em> 命令。

    【讨论】:

    • 感谢您提供的信息丰富的回答。我需要知道的另一件事:如何列出特定一天的所有提交:git log --since="2010-06-02" --until="2010-06-02" 什么都不列出。
    • @takeshin: 你试过git log --since="2010-06-02" --until="2010-06-03" 吗? (从一天 - 02 - 到另一天 - 03 -)
    • @VonC,是的,但在简单的循环中,我只知道日期,不知道下一个日期。
    • @VonC,我的计划是:生成唯一的日期列表:git log --pretty="format: %ad" --date=short | uniq 并在循环中迭代它们,类似于您的答案。
    • 不要将git branch 输出用于脚本;它是用户界面命令,它的输出可以改变。使用用于脚本的git show-refgit for-each-ref
    【解决方案3】:

    这里很脏,但我想出的脚本的工作版本:

    #!/bin/bash
    # Generates changelog day by day
    NEXT=$(date +%F)
    echo "CHANGELOG"
    echo ----------------------
    git log --no-merges --format="%cd" --date=short | sort -u -r | while read DATE ; do
        echo
        echo [$DATE]
        GIT_PAGER=cat git log --no-merges --format=" * %s" --since=$DATE --until=$NEXT
        NEXT=$DATE
    done
    

    【讨论】:

    • 只需使用管道进入循环:produce-and-sort-dates | while read DATE; do …; done。顺便说一句,您可能希望 GIT_PAGER=cat git log … 用于第二个(以防止 git log 在整个脚本的输出进入终端时使用分页器)。此外,您可能希望与--no-merges 保持一致,否则如果一天的所有提交都合并,您可能会得到[date] 标头而没有任何提交。
    • 谢谢你,克里斯。我已经更新了代码。 (之前我试图在循环末尾添加管道)
    • @takeshin 很棒的剧本。但是日期有问题。具体来说,它将今天的提交聚合到昨天。我用这个替换了GIT_PAGER 行,它是固定的:GIT_PAGER=cat git log --no-merges --format=" * %s" --since="$DATE 00:00" --until="$DATE 23:59" 更改后不需要$NEXT 变量
    【解决方案4】:

    我无法获得接受的答案来处理今天的提交,因为我的设置在第一次迭代时没有正确处理 NEXT 变量。 Git 的日志参数也将接受时间,这样就不需要 NEXT 日期了:

    #!/bin/bash
    # Generates changelog day by day
    echo "CHANGELOG"
    echo ----------------------
    git log --no-merges --format="%cd" --date=short | sort -u -r | while read DATE ; do
        echo
        echo [$DATE]
        GIT_PAGER=cat git log --no-merges --format=" * %s" --since="$DATE 00:00:00" --until="$DATE 24:00:00"
    done
    

    【讨论】:

    • 这真是太好了。唯一的问题是 echo [$DATE] 不起作用,因为它尝试评估表达式或其他内容。所以只要去掉括号就可以了
    【解决方案5】:

    我在 python 中编写了一个脚本来创建每周的 git 日志。

    您可以通过更改 timedelta 轻松将其更改为天、月等

    https://gist.github.com/NahimNasser/4772132

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-11
      • 2018-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-08
      相关资源
      最近更新 更多