一个比较大的项目一般都由一群人协作开发,开发人员可能活动于各个模块之间。前两天突然想起如果把一个工程的所有 commit 数据提取出来,然后按时间顺序动态演示出来可能会比较好玩。从这个过程中我们可以看到一个项目是如何进化的,各个开发者到底在折腾哪些模块。比如这是一个多个开发者参与的一个项目展示图,其实是 3D 动态的。
我写了两个脚本来做这件事情,代码放在这里了。第一个脚本是 Ruby 写的 gitstat.rb,用来提取 git 的 commit 数据,这些信息包括:提交者名字,日期,增加的行数,删减的行数,相关的模块。所有这些数据都按照提交的时间排序,然后输出到一个文本文件里。
使用方法是:
$./gitstat.rb -l eventmachine,tinyrb -o log.txt
-l 后面是模块名字列表,如果不加-l 脚本会自己检测出当前文件夹下所有的.git,每一个目录当做一个模块。log.txt 的格式看起来像这个样子:
Francis 2008-07-28T16:57:15+00:00 1 1 eventmachine
Francis 2008-07-28T17:03:46+00:00 2 0 eventmachine
Francis 2008-07-29T23:34:53+00:00 3 1 eventmachine
Macournoyer 2008-07-31T23:34:52+00:00 13 47 tinyrb
Macournoyer 2008-08-01T00:36:27+00:00 32 0 tinyrb
另外一个脚本就是 gitshow.py 用来从文件中读取数据,然后发送给 Ubigraph 渲染。
Ubigraph 可以从官方网站上下载,解压后会看到一个 example 目录,里面有几种语言的示例。使用方式是:
$./bin/ubigraph_server [在 Ubigraph 目录启动服务端]
$./gitshow.py log.txt
这里开发者用圆球表示,模块用多边形球表示,并且颜色加以区分。另外加入了一点效果就是当开发者有提交的时候,其颜色闪红一下,同时开发者和模块之间加上一条虚线。并且开发者和模块的体积会随着代码改变量而增大,这样也能看出哪些模块工作量比较大 (当然用行数来衡量工作量本身并没有多大参考价值,只是为了效果)。
对于一个多人参与的项目也可以看出一些好玩的信息来,如果一个开发者贡献大其体积越大,而且离项目的节点越近,比如 eventmachine 的演示图如下:
有一个类似的开源的 C++ 项目叫做:Gource,效果做得很漂亮。