本文介绍一个使用简单的脚本方法来统计各个开发者对一个git代码项目的提交代码行数,用于衡量各个开发者对于该项目的贡献量。
查看签入的提交代码行数
使用git命令行工具git log可以用于查看签入的各种信息,其中有个参数可以查看到每次签入的提交文件及其相关代码行数增减数目
git log --numstat --author="test"
一个输出的日志样例为,
Author: test <test@gmail.com> Date: Tue Jan 5 01:20:49 2016 +0800 add lombok feature. 10 1 pom.xml 5 16 src/main/java/com/peipeihh/spring/po/UserPO.java
在上述日志中,可以看到每次代码签入的改动文件,及其每个文件的代码改动量,其中第一个数字为代码增加量,第二个数字为代码减少量。有了这些日志,我们就可以使用awk工具统计下当前开发者总体增减行数量,脚本如下,
git log --numstat --author="test" | awk 'BEGIN{add=0;subs=0;loc=0} {if($1~/^[0-9]+/){add += $1; subs += $2; loc += $1 + $2 }} END {printf "%s\t%s\t%s\n", add, subs, loc }'
其中:变量add统计的为代码增减量,subs统计的为代码减少量,然后将add和subs相加得到代码改动行数loc,这样就可以获取到一个开发者在某个代码项目中改动的代码行数。
统计每人签入的代码行数
在统计每人签入的代码行数之前,还需要获取所有开发者列表,
git log --format='%aN' | sort -u
接下来要做的事情,就是逐一统计每个开发者的签入代码行数,一个简单的脚本如下,
git log --format='%aN' | sort -u | while read name; do echo -en "$name\t"; git log --numstat --author="$name" | awk 'BEGIN{add=0;subs=0;loc=0} {if($1~/^[0-9]+/){add += $1; subs += $2; loc += $1 + $2 }} END {printf "%s\t%s\t%s\n", add, subs, loc }'; done;
一个输出结果样例为,
test 32469 22 32491
优化建议
为了让统计更加准确和有意义,可以做如下改进,
过滤合并的代码
一般情况下需要对合并的代码量过滤掉,不计入统计,这可以通过加上--no-merges参数,
git log --numstat --author="test" --no-merges
过滤提交代码量大于10000行的提交
有时候提交的代码中不免含有引入第三方代码库的时候,这个时候可以在统计的时候过滤掉代码量过于大的代码提交(>10000),
git log --numstat --author="test" | awk 'BEGIN{add=0;subs=0;loc=0} {if(($1~/^[0-9]+/) && ($1<10000)){add += $1; subs += $2; loc += $1 + $2 }} END {printf "%s\t%s\t%s\n", add, subs, loc }';
按时间区段
如果需要统计某个时间区段,比如统计9月份的代码签入情况,可以加上--since/--until参数,
git log --numstat --author="test" --since=2016-9-01 --until=2016-9-30
后记
上面的统计方法可以简单的统计一个git代码仓库中每个开发者提交的代码行数,依次类推还可以统计文件数目、统计签入次数等等,还可以根据情况深入优化统计数据,这个就让读者自己根据上述资料来写个简单脚本了。
参考资料
Git log: https://git-scm.com/docs/git-log