自己动手:bash脚本工具统计git历史, 发掘谷歌在Android项目奥秘

原创 2013年12月04日 10:25:08

和几个项目经理朋友聊到项目工作量评估,公司内部对代码量,工程师的工作量通常有集成工具记录和衡量,但是如何比对其它业界的项目效率就成立讨论焦点,比如Google的Android工程师的代码出产效率,每个项目都花费了多少人力等等。受人之托,从Android的Git历史中研究以下这些问题,于是有了这个Bash脚本工具。

最新版本的github.com下载链接 https://github.com/neokidd/ghist2db

使用这个工具的前提是你有包含完整Git历史信息的Android的代码库,一般来说,是用"repo sync"来完成的下载的代码库,可以是全部project,也可以是部分的,比如说是用"repo sync framewors/base"这样单独sync的某些project。

repo for-all -c ghist2db.sh

输出结果是在代码库顶级目录下的一个ginfo.db文件,然后就可以用sqlite3来取得许多有趣的统计信息。比如在Android 4.0.4上,谷歌工程师commit的次数一共是155416,最多的工程师是三位大神是jessewilson@google.com, hackbod@google.com (Diane Hackbod, 大名鼎鼎的framework工程师), omakoto@google.com。另外,如何假设每个谷歌工程师每周3次commit,那么Android 4.0.4共花费了51805 staff*week的工作量。
源代码如下:

实现上有这么几个key points:

1. step1中,定制git log的输出历史格式,重点是--pretty参数,让输出直接是sql语句。另外--author可以指定只输出@google.com的作者,就是只看googler的代码贡献。这里取以下这些字段,更多的可以看man page (man git-log)
 %h: abbreviated commit hash
 %ae: author email
 %ce: committer email

 %at: author date, UNIX timestamp


2. step2中,把这些单独的sql语句组合成事务,目的是避免过多的插入事务对DB产生不必要的负担。


3. step3中,在开头加入创建db的语句,注意需要用到if not exists。


4. step4中,用sqlite3来执行这些sql语句。


5. Android原生的repo for-all负责遍历每个project,并运行ghist2db.sh这个脚本。所有信息被插入同一个db。


几个值得注意的细节:
1. Bash的字符串操作有许多方法。一类是用sed或者awk,比如line 36行,另一类用sh或者bash的内建方法,比如find_repo_top()中用到的子串的查找,${cwd%\/*},${repo_top##*\/}。参考资料:
Bash string manipulating:
http://tldp.org/LDP/abs/html/string-manipulation.html
SED:
http://www.doc88.com/p-0079912374852.html

2. Bash的if比较语句,[]里的语句和“[”之间需要有空格,开始是总是不习惯这样写。另外,字符串比较, 变量需要quote,比如"$cwd" != "~"。

3. 在指定行插入text,方法有多种,比如还是sed的方法,如果仅在开头或者结尾插入,可以echo源文件,在前后添加,如果step2中。sed的好用方法还可以参见这里(比如sed -i):
http://superuser.com/questions/246837/how-do-i-add-text-to-the-beginning-of-a-file-in-bash
http://www.doc88.com/p-0079912374852.html

4. Bash调试:用bash -x选项,得到每行的输入参数,方便查找问题。


版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

使用git Bash工具上传网站项目到github

github 托管网站过程指导

Bash玩转脚本4之搞一套完整的Android反编译与分包工具

Bash玩转脚本4之搞一套完整的Android反编译与分包工具 主讲Android反编译签名生成多个包的思路和实现: 实现从拿到一个apk安装包,把这个包反编译生成n个包,标示每个包的信...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

OSX: 实用脚本程序(bash scripts)系列-22- 用户登陆历史

好久木有分享代码了,今天找到一个,这个挺好,可以从log里面把用户登陆/登出的用户名和时间显示出来,对于想看看电脑何时/谁使用了多长时间电脑有所帮助,这个是网上抄过来的:

安卓开发利器 谷歌发布Android Studio 工具介绍

官方帮助文档及下载地址 http://developer.android.com/sdk/installing/studio.html              &#...

谷歌开发工具Android Studio安装使用图文教程

昨天Google I/O开发者大会上宣布,Android Studio 1.0的前瞻版发布了,今早马上下载尝下鲜。 下载地址如下: https://developer.android.com/sd...

谷歌开发工具Android Studio安装使用图文教程

昨天Google I/O开发者大会上宣布,Android Studio 1.0的前瞻版发布了,今早马上下载尝下鲜。 下载地址如下: https://developer.android.co...

6.4 Git 工具 - 重写历史

重写历史 很多时候,在 Git 上工作的时候,你也许会由于某种原因想要修订你的提交历史。Git 的一个卓越之处就是它允许你在最后可能的时刻再作决定。你可以在你即将提交暂存区时决定什么文件归入...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)