Git:逐日更改日志

22

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

[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脚本可以推断出文件在某个分支中是否被修改过?


1
如果由于某个贡献者的时钟偏差/配置错误而导致提交日期不是单调递增的,会怎么样? - Jakub Narębski
5个回答

29

以下是我想出的脚本,代码有些凌乱,但能够运行:

#!/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

1
只需将管道放入循环中:produce-and-sort-dates | while read DATE; do …; done。顺便说一下,您可能需要 GIT_PAGER=cat git log … 来防止 git log 在整个脚本输出到终端时使用分页器。另外,您可能希望保持一致性使用 --no-merges,否则如果一天的所有提交都是合并提交,则可能会得到不带任何提交的 [date] 标题。 - Chris Johnsen
谢谢Chris。我已经更新了代码。(之前我试图在循环结尾添加管道) - takeshin
@takeshin 很棒的脚本。但是日期有问题。具体来说,它将今天的提交聚合到昨天。我用这个替换了 GIT_PAGER 行,问题就解决了:GIT_PAGER=cat git log --no-merges --format=" * %s" --since="$DATE 00:00" --until="$DATE 23:59" 这个更改后不需要 $NEXT 变量。 - lsaffie

13

我无法使用已接受的答案来处理今天的提交,因为我的设置在第一次迭代时无法正确处理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]不起作用,因为它试图评估一个表达式或其他内容。所以只需删除括号就可以了。 - Yanis
请提供原始文本以便进行翻译。 - Vzans

1

git log 命令有 --since--until 参数,围绕这些参数进行一些封装应该不难。


1

这肯定需要一些脚本。
有点像这样 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所述。
git for-each-refgit show-ref是自然候选用于脚本命令的“管道”命令。

感谢您提供这个信息丰富的答案。我还需要知道一件事:如何列出特定日期的所有提交记录: git log --since="2010-06-02" --until="2010-06-02" 什么也不显示。 - takeshin
@takeshin:你试过 git log --since="2010-06-02" --until="2010-06-03" 吗?(从第二天到第三天) - VonC
@VonC,我的计划是:生成唯一日期列表:git log --pretty="format: %ad" --date=short | uniq,并在循环中迭代它们,类似于您答案中的方法。 - takeshin
1
不要在脚本中使用 git branch 命令的输出;它是用户界面命令,其输出可能会发生变化。请使用 git show-refgit for-each-ref 命令,这些命令适用于脚本编写。 - Jakub Narębski
不使用 git branch 的一个例子:当您正在进行 rebase 时,这会导致错误。 - Michael Deardeuff
显示剩余2条评论

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接