我想计算git中的提交之间的时间,这(我希望)会给我一个粗略的衡量我的生产力的方法。这可能吗?
答案 0 :(得分:2)
这将打印较新提交的日期,然后是旧提交的日期:
git log HEAD~[newer_commit] -n 1 --format=%ad; \
git log HEAD~[older_commit] -n 1 --format=%ad
你最终会得到日期字符串。使用您喜欢的任何语言来计算差异。
答案 1 :(得分:1)
如果您可以将git log
的输出发送到文件,那么您已经在那里中途了。我不确定您最喜欢哪种语言,但我知道在bash脚本中这很容易。
答案 2 :(得分:1)
以下是使用bash
和date
执行此操作的更完整示例。
首先,如Git: want to iterate through all commits on branch, and list files in each commit中所述:
git rev-list将以反向时间顺序列出从给定提交可到达的所有修订,因此您可以向其传递分支名称以向后获取该分支头的列表
所以,基本上,我的想法是我使用rev-list
从HEAD向后遍历repo历史,并在每个修订版本中获取当前时间戳和先前提交的时间戳;将它们作为UNIX时间戳获取,因为我们可以直接在bash
中进行整数运算(差异);最后使用date
显示日期。所以这个bash
脚本将是:
for ix in `git rev-list master`; do
thists=`git log $ix -n 1 --format=%ct`;
prevts=`git log $ix~1 -n 1 --format=%ct 2>/dev/null`;
if [ ! -z "$prevts" ] ; then
delta=$(( $thists - $prevts ));
echo `date -d @$thists +'%Y-%m-%d %H:%M:%S'` "-->" \
`date -d @$prevts +'%Y-%m-%d %H:%M:%S'` " ;= " \
`date -d @$delta +'%H:%M:%S'`;
fi;
done
请注意,当您第一次提交时,没有先前/父提交,因此git log
将失败:fatal: ambiguous argument '45e95c7...~1': unknown revision or path not in the working tree.
;为了避免打印此消息,我将stderr
重定向到/dev/null
命令中的prevts
,然后仅在prevts
不为空时执行时间增量计算。此脚本的输出如下所示:
2017-08-27 09:44:04 --> 2017-08-26 17:12:22 ;= 17:31:42
2017-08-26 17:12:22 --> 2017-08-26 16:48:24 ;= 01:23:58
2017-08-26 16:48:24 --> 2017-08-26 16:28:05 ;= 01:20:19
...
然而,这些增量只有一个小时 - 所以为了更准确地显示时间增量,我使用了Python datetime.timedelta
- 所以在上面的脚本中,你可能想要替换{{ 1}}行:
`date -d @$delta +'%H:%M:%S'`;
...在这种情况下会生成此日志:
`python -c "import datetime as dt; d = dt.timedelta(seconds=$delta); print(d)"`