如何编写 git 统计命令,以及分享一些 git 统计命令
年底了,需要做一些数据统计了,于是需要用到 git log 来统计一些数据。
作为了一个git小白,哪会什么命令,只能百度,可是百度出来的又不符合自己的需求,脚本也看得不是很明白,因为我同样也是 linux 小白(突然感觉自己什么都不会(づ╥﹏╥)づ )
我这参考的是这篇文章:https://www.cnblogs.com/bellkosmos/p/5923439.html 我这里就不做使用的说明了。
还是有些不满足我的需求的,比如:我需要统计每个人在2017年中开发的代码行数。
所以还是需要自己去写这些脚本,一个不懂linux系统的人,很多语句都是看不懂的。
分析看来,脚本中常见的有 wc 、 sort 、gawk 这些关键词,百度之后才知道这都是linux的命令,而 “|” 则是管道的意思。
git log 的使用:https://www.cnblogs.com/bellkosmos/p/5923439.html
wc 的使用:https://www.cnblogs.com/peida/archive/2012/12/18/2822758.html
sort 的使用:https://www.cnblogs.com/dong008259/archive/2011/12/08/2281214.html
gawk 的使用:https://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html
看过这些命令的使用之后,大致就有了一个思路了(具体的语法使用请参考上面列出的对应文章)。
1, 首先需要查找出2017年的所有提交记录信息,并过滤掉 merge 的提交
git log --since="2016-12-31" --until="2017-12-31" --no-merges
2, 需要显示每次提交变更的代码行数,输出邮箱
git log --since="2016-12-31" --until="2017-12-31" --no-merges --numstat --pretty=format:"%ae"
3, 最后再按提交的邮箱统计代码行数, 这步比较麻烦了,我这里是这样处理的,如果是3列(新增行数, 删除行数, 文件名),那么表示是变更的日志信息,如果是一列,则表示取到的是邮箱地址。
代码的逻辑就是:如果是1列,设置变量k为当前的邮箱,如果是3列,那么进行汇总(arr[k]+=当前值)。在处理完之后,再对数组进行循环输出,输出之后再进行一个排序处理,也就能达到我们想要的效果了。
gawk 逻辑代码:
{ if(NF==1){ k = $NF; // 设置 k 为当前的邮箱 }else if(NF==3){ arr[k] += ($1 + $2); // 新增的代码行数 + 减少的代码行数 } } END { for(k in arr){ // 循环输出 printf "%50s %20s\n", k, arr[k]; } }
最后按数值进行排序,组织好的 git 命令:
git log --since="2016-12-31" --until="2017-12-31" --no-merges --numstat --pretty=format:"%ae" | gawk '{if(NF==1){k=$NF;}else if(NF==3){arr[k]+=($1+$2);}}END{for(k in arr){printf "%50s %20s\n", k, arr[k]}}' | sort -k 2 -r
下面这些就是我需要做的统计,可做一个参考:
# 统计总共贡献人数
git log --pretty=format:'%ae' --since="2016-12-31" --until="2017-12-31" | sort -u | wc -l
# 可能每个人会有多个帐号,所以需要过滤账号,可以把所有记录查询出来,然后过滤账号之后再做统计
git log --pretty=format:'%ae' --since="2016-12-31" --until="2017-12-31" | sort -u
# 统计总提交次数
git log --pretty=format:'%ae' --since="2016-12-31" --until="2017-12-31" | wc -l
# 统计总提交行数
git log --no-merges --numstat --pretty=tformat:"%ae" --after="2016-12-31" --before="2017-12-31" | gawk '{if(NF==3){c+=($1-$2);}}END{printf "%20s\n", c}' | sort -k 2 -r
# 新增开发多少(即1月分没有提交历史记录的则认为是新增的开发)
git log --no-merges --pretty=tformat:"%ae %cd" --date=format:"%y%m%d" --after="2016-12-31" --before="2017-12-31" | sort -k 1 | gawk '{if(c[$1]==null){c[$1]=$2;}}END{for(k in c){printf "%50s %20s\n", k,c[k]}}' | sort -k 2 | gawk '{if($2>=170201){printf "%50s %20s\n", $1, $2}}'
# block开发多少(12月份没有提交历史记录的则认为是block的开发)
git log --no-merges --pretty=tformat:"%ae %cd" --date=format:"%y%m%d" --after="2016-12-31" --before="2017-12-31" | sort -k 1 -k 2 -r | gawk '{if(c[$1]==null){c[$1]=$2;}}END{for(k in c){printf "%50s %20s\n", k,c[k]}}' | sort -k 2 | gawk '{if($2<171201){printf "%50s %20s\n", $1, $2}}'
# 离开的开发中,提交的代码行数最多的开发和行数总计
git log --no-merges --numstat --pretty=tformat:"%ae" --after="2016-12-31" --before="2017-12-31" | gawk '{if(NF==3){cc[c]+=($1-$2);}else if(NF==1){c=$NF;}}END{for(k in cc){printf "%50s %20s\n", k, cc[k]}}' | sort -k 2 -r
# 按邮箱统计指定时间范围内所变更的代码行数
git log --no-merges --numstat --pretty=tformat:"%ae" --after="2016-12-31" --before="2017-12-31" | gawk '{if(NF==3){cc[c]+=($1-$2);}else if(NF==1){c=$NF;}}END{for(k in cc){printf "%50s %20s\n", k, cc[k]}}' | sort -k 2 -r
# 深夜提交王(22:30之后 8:30之前)
git log --no-merges --pretty=tformat:"%ae %cd" --after="2016-12-31" --before="2017-12-31" --date=format:"%H %M" | gawk '{if(($2*100+$3)>=2230||($2*100+$3)<=830){++c[$1];}}END{for(k in c){printf "%30s %20s\n",k,c[k]}}' | sort -k 2 -r

浙公网安备 33010602011771号