17 January 2015
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 | wc -l

    • -s 显示提交次数和提交描述 这个命令用来得到提交过代码的用户数量,用来计算用户平均提交次数。git log将日志按用户进行聚合。Suppress commit description and provide a commit count summary only,只显示用户及提交次数。wc是shell命令,用来统计单词数,-l参数用来统计行数。Git命令返回结果如下:

      6 Bryce 34 git 6 mnhkahn

  • 2. 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

    倒序显示全部的时间片、日期、用户名和邮箱日志。计算出来最后一次提交时间、第一次提交时间。时间用来计算每小时、每天、每周、每月、每年的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

    倒序显示时间片和哈希值。把这两个值保存到cache里面。

      1420382132 dd29c4a84acc48c2d30583db0ac47235818142c3
    
  • 5. 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

    统计主分支代码行数,根据日期计算代码行数比直接遍历日志好。得到的是两行结果,分别得到时间片、用户名,增加和删除的代码行数。最后得到得到每天、每月、每年、一共增加、删除的代码行数。

      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

    再遍历一遍所有日志(不只是主分支),查询提交的人和内容。这样计算出每个人每天增加、删除、提交的行数和次数。

      1420382132 mnhkahn (lichao0407@gmail.com)
      1 file changed, 20 insertions(+)
    
  • 8. git –git-dir=.git –work-tree=./ rev-parse –short HEAD

    获取git项目版本号。

      782226c
    

最后说明一下,图片和二进制这些非文本文件不会被统计行数。上面所有的例子取自我的go_code项目下,如果大家想照着做一下,欢迎clone我的代码,地址点这里


参考文献

原文链接:使用Git工具统计代码,转载请注明来源!

EOF

欢迎加微信交流与吐槽



本站总访问量次; 本站访客数人次; 本文总阅读量次;