使用Git工具统计代码
GitStats源码分析。
- 1. git shortlog -s –since=2013-12-01 –before=2015-12-10 HEAD –no-merges
- 2. git show-ref –tags
- 3. git rev-list –pretty=format:”%at %ai %aN (%aE)” –since=2013-12-01 –before=2015-12-10 HEAD | grep -v ^commit
- 4. git rev-list –pretty=format:”%at %T” –since=2013-12-01 –before=2015-12-10 HEAD | grep -v ^commit
- 5. git ls-tree -r -l -z HEAD
- 6. git log –shortstat –first-parent -m –pretty=format:”%at %aN (%aE)” –since=2013-12-01 –before=2015-12-10 HEAD
- 7. git log –shortstat –date-order –pretty=format:”%at %aN (%aE)” –since=2013-12-01 –before=2015-12-10 HEAD
- 8. git –git-dir=.git –work-tree=./ rev-parse –short HEAD
之前一直想写一个统计代码行数的工具,就是遍历一下文件目录,把里面文件的行数读一下。一直就是想这么干。但是这样干比较low,这是一锤子买卖,只能干一次,第二次统计就还是从头开始统计,没办法统计一个区间下修改行数。想要统计每天修改的行数,就更难,难到需要每天都运行一次并且把数字存下来么?还有,如果要统计每个人修改的情况改怎么办?这个办法就不行了。
GitStats项目,用Python开发的一个工具,通过封装Git命令来实现统计出来代码情况并且生成可浏览的网页。官方文档可以参考这里。
其实这个项目的核心就是Git命令,如果项目是在Git下托管的,那么围绕git log
命令都能够实现。虽然Git是我常用的代码仓库,但是只会提代码、合并代码这些操作,还是得学。我就把阅读GitStats源码相关的Git笔记放到这里,和大家分享。
将会用到8个命令:
1. git shortlog -s –since=2013-12-01 –before=2015-12-10 HEAD –no-merges
git shortlog -s --since=2013-12-01 --before=2015-12-10 HEAD --no-merges
-s
显示提交次数和提交描述 这个命令用来得到提交过代码的用户数量,用来计算用户平均提交次数。git log将日志按用户进行聚合。Suppress commit description and provide a commit count summary only,只显示用户及提交次数。wc
是shell命令,用来统计单词数,-l
参数用来统计行数。Git命令返回结果如下:
6 Bryce
34 git
11 lichao
12 mnhkahn
2. git show-ref –tags
git show-ref --tags
获取tag相关内容。显示本地commit ID和远程分支的关系。Git里面的tag我没有用过,暂且先不分析他。
3. git rev-list –pretty=format:”%at %ai %aN (%aE)” –since=2013-12-01 –before=2015-12-10 HEAD | grep -v ^commit
git rev-list --pretty=format:"%at %ai %aN (%aE)" --since=2013-12-01 --before=2015-12-10 HEAD | grep -v ^commit
倒序显示全部的时间片、日期、用户名和邮箱日志。计算出来最后一次提交时间、第一次提交时间。时间用来计算每小时、每天、每周、每月、每年的activity。为每一个用户计算第一次和最后一次提交的时间。根据时间片得到时间,记录当月、当年用户的提交次数和当月提交次数。记录作者的活动天数和最后活动日期。git rev-list
按时间倒序。返回结果和参数解释如下:
420382132 2015-01-04 22:35:32 +0800 mnhkahn (lichao0407@gmail.com)
- %at: 日期, UNIX timestamp
- %ai: 日期, ISO 8601 格式
- %aN: mailmap的作者名字
- %aE: 作者邮箱
- %T: tree hash
4. git rev-list –pretty=format:”%at %T” –since=2013-12-01 –before=2015-12-10 HEAD | grep -v ^commit
git rev-list --pretty=format:"%at %T" --since=2013-12-01 --before=2015-12-10 HEAD | grep -v ^commit
倒序显示时间片和哈希值。把这两个值保存到cache里面。
1420382132 dd29c4a84acc48c2d30583db0ac47235818142c3
5. git ls-tree -r -l -z HEAD
git ls-tree -r -l -z HEAD
100644 blob 6982c3544235f7c141bfe4e509eb5ed55bbfd0e0 675 wallpaper/win32api/kernel.go
- -r 递归调用
- -l 显示文件大小(和ls -a命令返回的大小数一样)。
- -z 以\0作为行连接符 显示所有文件的commit hash、大小、文件名。6982c3544235f7c141bfe4e509eb5ed55bbfd0e0是blob_id,675是文件大小,最后一个参数是文件路径。根据此计算后缀名提交次数。可以根据文件路径过滤指定路径和指定后缀的文件。像ls -a一样展示所有文件。
6. git log –shortstat –first-parent -m –pretty=format:”%at %aN (%aE)” –since=2013-12-01 –before=2015-12-10 HEAD
git log --shortstat --first-parent -m --pretty=format:"%at %aN (%aE)" --since=2013-12-01 --before=2015-12-10 HEAD
统计主分支代码行数,根据日期计算代码行数比直接遍历日志好。得到的是两行结果,分别得到时间片、用户名,增加和删除的代码行数。最后得到得到每天、每月、每年、一共增加、删除的代码行数。
1420382132 mnhkahn (lichao0407@gmail.com)
1 file changed, 20 insertions(+)
- –stat
commit 782226c323df77dfaf99c5e8cb188a04d1539ec4
Author: mnhkahn <lichao0407@gmail.com>
Date: Sun Jan 4 22:35:32 2015 +0800
sego
test_sego.go | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
- –shortstat 显示stat的最后一行,修改文件的总数
- –first-parent 根据第一次父提交来查看合并提交。
- -m 只关心主分支,不考虑合并代码
- –date-order
7. git log –shortstat –date-order –pretty=format:”%at %aN (%aE)” –since=2013-12-01 –before=2015-12-10 HEAD
git log --shortstat --date-order --pretty=format:"%at %aN (%aE)" --since=2013-12-01 --before=2015-12-10 HEAD
再遍历一遍所有日志(不只是主分支),查询提交的人和内容。这样计算出每个人每天增加、删除、提交的行数和次数。
1420382132 mnhkahn (lichao0407@gmail.com)
1 file changed, 20 insertions(+)
8. git –git-dir=.git –work-tree=./ rev-parse –short HEAD
git --git-dir=.git --work-tree=./ rev-parse --short HEAD
获取git项目版本号。
782226c
最后说明一下,图片和二进制这些非文本文件不会被统计行数。上面所有的例子取自我的go_code项目下,如果大家想照着做一下,欢迎clone我的代码,地址点这里。
参考文献
- git-shortlog(1) Manual Page
- 个性化你的Git Log的输出格式 - hisea
- git-ls-tree(1) Manual Page
- git-log(1) Manual Page
- Git - git-rev-parse Documentation
- git-rev-parse(1) Manual Page
原文链接:使用Git工具统计代码,转载请注明来源!
–EOF–