17 January 2015

IMG-THUMBNAIL

GitStats源码分析。

之前一直想写一个统计代码行数的工具,就是遍历一下文件目录,把里面文件的行数读一下。一直就是想这么干。但是这样干比较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工具统计代码,转载请注明来源!

EOF