枯荷听雨

情不知所起,一往情深.

I ❤ U

如何编写 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

 

posted @ 2018-01-20 21:56  枯荷听雨  阅读(192)  评论(0)    收藏  举报