计算git提交之间的时间

时间:2014-03-29 00:31:25

标签: git git-commit

我想计算git中的提交之间的时间,这(我希望)会给我一个粗略的衡量我的生产力的方法。这可能吗?

3 个答案:

答案 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)

以下是使用bashdate执行此操作的更完整示例。

首先,如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)"`
相关问题