2016-3-15 update: 项目已提交至GitHub,地址https://github.com/yeatse/git-log-weekly-report/


最近公司主管突然让我们每周末发周报了,具体就是总结一下上周都干了什么之类的。从小学开始就经常不交作业的我心里是一百个不愿意,但是这个是跟绩效挂钩的,人总不能跟钱过不去嘛,没办法只能养成习惯去写周记了。

当然,作为一个懒惰的程序员,每周让我拿出半个小时的时间去整理周报这种事我是不会去做的。好在现在的项目是用git作为版本控制工具的,用git log命令的话,只要一行就可以在屏幕输出日志内容了:

1
$ git log --author="yeatse" --format="%cd : %s" --since=last.Monday --reverse --no-merges --date=format:'%F %T'

具体的参数意义在git-log Documentation上可以找到(其中date format选项需要升级git版本到v2.6.0rc以上才有效)。输出的结果大概是这个样子:

1
2
3
4
5
2016-02-29 22:04:54 : Update elctron-prebuilt version. Fix #11.
2016-02-29 22:49:51 : Optimize user's avatar display in Linux.
2016-02-29 23:03:20 : Disable zooming in the app.
2016-03-01 00:23:32 : Introduce travis CI.
2016-03-01 00:28:14 : Fix tar-all chmod.

不过即使这样,每次还要打这么一长串命令,而且输出的结果需要手动编辑一下才能看,实在不够偷懒,最后还是在GitHub上找到了一个合适的轮子,自己魔改了一下,大致符合了自己的需求:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# Generates git changelog grouped by day and output it to file
#
# optional parameters
# -a to filter by author
# -s to select start date
# -e to select end date
# -o to save it to file
# -r to specify the repository path
NEXT=$(date +%F)
SINCE="last.Monday"
UNTIL=$NEXT
AUTHOR=$(git config user.email)
OUTPUT="$(date +%F).log"
while getopts "a:s:e:o:r:" arg
do
case $arg in
a)
AUTHOR=$OPTARG
;;
s)
SINCE=$OPTARG
;;
e)
UNTIL=$OPTARG
;;
o)
OUTPUT=$OPTARG
;;
r)
REPO=$OPTARG
;;
?)
echo "unknown argument"
exit 1
;;
esac
done
(
git -C "${REPO}" log --author="${AUTHOR}" --since="${SINCE}" --until="${UNTIL}" --format="%cd" --date=short | sort -u | while read DATE ; do
GIT_PAGER=$(git -C "${REPO}" log --no-merges --reverse --format="* %s" --since="${DATE} 00:00:00" --until="${DATE} 23:59:59" --author="${AUTHOR}")
if [ ! -z "$GIT_PAGER" ]
then
echo "[${DATE}]"
echo "${GIT_PAGER}"
echo
fi
done
) > $OUTPUT
echo "log is written to ${OUTPUT}"

使用方法也很简单,chmod +x之后直接执行脚本,日志就会输出到yyyy-MM-dd.log文件里啦。
日志默认是以当前git config的邮箱来过滤作者的,具体的可选参数列表在脚本开头可以找到。拿来试了GitHub上一个项目,结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[2016-02-29]
* Update elctron-prebuilt version. Fix #11.
* Optimize user's avatar display in Linux.
* Disable zooming in the app.
[2016-03-01]
* Introduce travis CI.
* Fix tar-all chmod.
* Introduce gitter.
* Update docs for the new release.
* Fix travis deployment files.
* Fix wrong regex which might cause stickers not showing in group chat.
* Force travis work.
* Update travis config and wrong regex.
[2016-03-04]
* Remove unnecessary dev tools.
* Take control of quit event. Press Cmd+Q to quit, and Cmd+W to hide window.
[2016-03-05]
* Modify implementation of listening message change, which caused scrolling jank. Fix #66.
* Revert <q>修正消息统计</q>
* Take control over reload. Useful when session timeout and needs refresh.
* Improve experience on the Linux platform. Specifically fix wrong app icon, add tray icon, add menu and override shortcuts.

稍微润色下就可以交差啦,好评好评。