按日期和用户分组的 Git 变更日志

按日期和用户分组的 Git 变更日志

当前生成更改日志的代码:

svn2cl --linelen 78 --reparagraph --include-rev --group-by-day

我能得到的最接近的香草选项是

git shortlog --format='* [%h] %s' -w78,8,10

svn2cl如何尽可能地模拟输出?

输出示例:

2013-02-19  username

        * [r30695] path1: commit message
        * [r30691] path2, path3, path4: looooooooooooooooooooooooooooong
          commit message
        * [r30690] path1, path3: commit message

2013-02-19  other_user
        * ...

2013-02-18  username
        * ...

仍然存在两个问题:

  • 在提交消息之前包含人类可读的路径列表
  • 漂亮打印长提交消息

答案1

另一种解决方案给出了正确的方向。到目前为止的结果:

#!/usr/bin/env bash
while read -r -u 9 date name
do
    echo "$date  $name"
    echo
    GIT_PAGER=cat git log --no-merges --committer="$name" --since="$date 00:00:00 +0000" --until="$(date --date="$date + 1 day" +%Y-%m-%d) 00:00:00 +0000" --format='        * [%h] %s'
    echo
done 9< <(git log --no-merges --format=$'%cd %cn' --date=short | sort --unique --reverse)

午夜时间是必要的。看起来由于某种原因它默认使用当前时间而不是当天的开始时间。

仍然存在两个问题:

  • 在提交消息之前包含人类可读的路径列表
  • 漂亮打印长提交消息

示例输出:

2013-02-19  username

        * [f97bb5f] commit message
        * [f0e419d] looooooooooooooooooooooooooooong commit message
        * [070e50f] commit message

2013-02-19  other_user
        * ...

2013-02-18  username
        * ...

答案2

为了让它在 OS X 上工作,我对 l0b0 的解决方案做了一些小的修改:

git-grouped-log () {
  while read -r -u 9 since name
  do
    until=$(date -j -v+1d -f '%Y-%m-%d' $since +%Y-%m-%d)

    echo "$since $name"
    echo

    GIT_PAGER=cat git log             \
      --no-merges                     \
      --committer="$name"             \
      --since="$since 00:00:00 +0000" \
      --until="$until 00:00:00 +0000" \
      --format='  * [%h] %s'

    echo
  done 9< <(git log --no-merges --format=$'%cd %cn' --date=short | sort --unique --reverse)
}

我还将它包装在一个函数中,因为这样我就可以将它保存在任意文件中。

相关内容