SVN的可视化日志统计工具StatSVN
博客专区 > Day 的博客 > 博客详情
SVN的可视化日志统计工具StatSVN
Day 发表于7年前
SVN的可视化日志统计工具StatSVN
  • 发表于 7年前
  • 阅读 19771
  • 收藏 15
  • 点赞 3
  • 评论 21

标题:腾讯云 新注册用户域名抢购1元起>>>   

StatSVN很好的统计工具,能帮你统计团队成员各自的编写量,代码总数,提交情况,文件数量等情况,并且以html网页图表的方式发布统计结果。

以前写过一个叫NOVA的小程序,并用StatSVN管理,通过这个例子介绍StatSVN的一些功能

上面是发布报表的主页,这主要描述统计内容的起止时间,和代码行的统计情况等(据说代码行的数量包括空代码行,没有考证过)

然后可以看各个程序员的一些情况

统计了每月的编写情况,提交情况,代码修改占代码总数的百分比

一天中哪几小时比较活跃

每周那几天比较活跃

提交日志

文件数量统计

 

文件平均行数统计

统计的文件类型,以及文件以代码行数多少排序

文件以版本号(修改次数)排序。

文件夹的一些统计情况,还有一个目录统计图需要安装JAVA因为系统刚重装没装JAVA就不演示了~

搅动情况,蓝条长表示在某个时期修改的越多

 使用前提

 StatSVN的主页:http://www.statsvn.org/ 

它是一个2M多的JAR文件,是SVN的统计工具,统计结果以HTML格式保存。所以,如果要发布结果供团队成员浏览,需要一台服务器(或PC,貌似是废话...),安装网页服务器(apache2等),需要 JVAV (笔误 实为JAVA)环境,至少安装有SVN客户端,以便取得SVN服务器上的最新版本。apache2,java,svn的安装这里不做详细介绍(网上资料比较齐全)。

使用方法

下载statsvn.jar

用SVN客户端取得SVN服务器上的最新版本代码,比如Linux上的命令如下:

#check out 最新版本
svn co http://xxxx.xxxxx.xxxxx/xxxxx

生成新版本的log日志:

#生成项目SVN日志
svn log -v --xml > 日志名XXX.log

在存放统计结果HTML的目录中,执行statsvn.jar,一个简单的例子:

#简单例子
java -jar ../statsvn.jar ../nova/日志名XXX.log ../nova  -charset utf-8 -disable-twitter-button -title Nova  -include **/*.cpp:**/*.h -exclude **/sqlite3/*.*

java -jar ../statsvn.jar               执行statsvn.jar,后面是它的参数

参数1:../nova/日志名XXX.log                调用上面生成的SVN日志

参数2:../nova             最新版本所在的目录

参数3:-charset utf-8         生成的HTML所用的字符集

参数4:-disable-twitter-button            关闭twitter连接,可能statsvn的开发者是一个twitter爱好者,statsvn默认在项目和开发人员的名字后加个twitter连接按钮,方便互动。这在中国行不通,大家都懂的...所以让twitter连接按钮不显示。

参数5:-title 标题名             这个设置在HTML页面中显示的项目标题

参数6:-include **/*.cpp:**/*.h        表示统计的文件类型,默认情况下statsvn统计指定目录下的所有文件(包括一些开发环境自动生成的文件等,这个参数可以设置指定统计具体文件,例子中的表示只统计项目目录下得CPP与H文件。

参数7:-exclude **/sqlite3/*.*         表示不统计的内容,例子中的参数表示不统计项目文件夹中sqlite3的内容(因为sqlite3的内容是调用别人写的程序,统计进去没有意义~)

这就是statsvn最常用的几个参数,其他更详细参数可以参考官方网站的介绍。

扩展使用方法

由于StatSVN是静态的,需要执行一次才能查看新的结果,但是我们可以让他在系统中定时执行,比如每天晚上2:00执行一次,那么第二天就可以看到昨晚为止的所有统计情况。

以linux系统为例

我们可以把上述取得新版本,生成日志,生成统计的过程写成sh文件,并命名为"任务名.sh"

#!/bin/sh
cd ~
cd statsvn
svn co http://192.168.5.32/nova
cd nova
svn log -v --xml > svn.log
cd ..
cd novalog
java -jar ../statsvn.jar ../nova/svn.log ../nova  -charset utf-8 -disable-twitter-button -title Nova  -include **/*.cpp:**/*.h -exclude **/sqlite3/*.*

然后用crontab定时任务工具对这个sh进行定时执行(crontab的设置方法可以参考网上)

o@O:~$ crontab -l
# m h  dom mon dow   command
0 2 * * * /home/o/statsvn/任务名.sh
o@O:~$

把生成的html结果所在的目录软连接到apache的根目录(比如"www"文件夹下)就可以用过网页访问了。

 

StatSVN小巧简洁而且实用,是不错的团队管理工具,不过2010年初发布到版本0.7.0就没更新过了,不知道是不是烂尾了...实在可惜

共有 人打赏支持
Day
粉丝 34
博文 14
码字总数 10261
评论 (21)
软壳大虾
请教个问题:如果我只像统计一个文件夹下的代码,该如何操作?只check out那个文件夹?还是在那个文件夹下svn log?还是怎样?谢谢!
软壳大虾
请教个问题:如果我只像统计一个文件夹下的代码,该如何操作?只check out那个文件夹?还是在那个文件夹下svn log?还是怎样?谢谢!
Day

引用来自“软壳大虾”的评论

请教个问题:如果我只像统计一个文件夹下的代码,该如何操作?只check out那个文件夹?还是在那个文件夹下svn log?还是怎样?谢谢!

如果是一个项目中的文件夹,你生成项目的log后,在执行statsvn.jar 进行统计时,加入参数-include -exclude 做目录的匹配,就可以只统计指定目录里的代码了
软壳大虾

引用来自“Day”的评论

引用来自“软壳大虾”的评论

请教个问题:如果我只像统计一个文件夹下的代码,该如何操作?只check out那个文件夹?还是在那个文件夹下svn log?还是怎样?谢谢!

如果是一个项目中的文件夹,你生成项目的log后,在执行statsvn.jar 进行统计时,加入参数-include -exclude 做目录的匹配,就可以只统计指定目录里的代码了

请教具体如何编写?我看Statsvn的资料中,都是去匹配文件格式的。。我不会写脚本,能否写一条范例,我照着改改?
软壳大虾

引用来自“Day”的评论

引用来自“软壳大虾”的评论

请教个问题:如果我只像统计一个文件夹下的代码,该如何操作?只check out那个文件夹?还是在那个文件夹下svn log?还是怎样?谢谢!

如果是一个项目中的文件夹,你生成项目的log后,在执行statsvn.jar 进行统计时,加入参数-include -exclude 做目录的匹配,就可以只统计指定目录里的代码了

sorry,看的不仔细,你的文章中已经提到了。。我再试试~
Day

引用来自“软壳大虾”的评论

引用来自“Day”的评论

引用来自“软壳大虾”的评论

请教个问题:如果我只像统计一个文件夹下的代码,该如何操作?只check out那个文件夹?还是在那个文件夹下svn log?还是怎样?谢谢!

如果是一个项目中的文件夹,你生成项目的log后,在执行statsvn.jar 进行统计时,加入参数-include -exclude 做目录的匹配,就可以只统计指定目录里的代码了

sorry,看的不仔细,你的文章中已经提到了。。我再试试~

恩,可以参考 java -jar ../statsvn.jar ../nova/svn.log ../nova -charset utf-8 -disable-twitter-button -title Nova -include **/*.cpp:**/*.h -exclude **/sqlite3/*.*
软壳大虾

引用来自“Day”的评论

引用来自“软壳大虾”的评论

引用来自“Day”的评论

引用来自“软壳大虾”的评论

请教个问题:如果我只像统计一个文件夹下的代码,该如何操作?只check out那个文件夹?还是在那个文件夹下svn log?还是怎样?谢谢!

如果是一个项目中的文件夹,你生成项目的log后,在执行statsvn.jar 进行统计时,加入参数-include -exclude 做目录的匹配,就可以只统计指定目录里的代码了

sorry,看的不仔细,你的文章中已经提到了。。我再试试~

恩,可以参考 java -jar ../statsvn.jar ../nova/svn.log ../nova -charset utf-8 -disable-twitter-button -title Nova -include **/*.cpp:**/*.h -exclude **/sqlite3/*.*

按照你给出的格式,我改变为:
java -jar statsvn.jar -include **/F:/JR_Universe/01DEV/09-source/02-CPMonitor/*.* F:\JR_Universe\logfile.log F:\JR_Universe\
结果就是报错提示:
The repository object is not valid. Please check your settings.
Possoble reasons:
1.用-v去生成svnlog
2.log是空的吗
3.实在check out的目录执行的吗
4.有没有non-committed的项

把-include那段去掉,就可以正常运行。请教是什么原因?我的命令有错的话应如何纠正?
Day
1,3,在check out的目录执行log 命令生成xml
2,log不是空的,是svn的日志。
目录不要带上f盘,是相对于项目目录的路径。 **/09-source/02-CPMonitor/*.* 就是指项目目录下路径里包含有“/09-source/02-CPMonitor/”的所有文件。(不要带上F盘)
软壳大虾

引用来自“Day”的评论

1,3,在check out的目录执行log 命令生成xml
2,log不是空的,是svn的日志。
目录不要带上f盘,是相对于项目目录的路径。 **/09-source/02-CPMonitor/*.* 就是指项目目录下路径里包含有“/09-source/02-CPMonitor/”的所有文件。(不要带上F盘)

谢谢!
你说的路径问题,我再试试,虽然我好像都试过了,从“F:”开始一层层删除。。

另外我发现,可以在生成log的时候,就到指定的文件夹下去操作。所以只要不是需选取太多文件夹,就可以在生成log时就筛选出想要的路径、时间范围、版本范围。然后生成统计一部就不用限制路径了,log文件小,速度也快了很多~
Day

引用来自“软壳大虾”的评论

引用来自“Day”的评论

1,3,在check out的目录执行log 命令生成xml
2,log不是空的,是svn的日志。
目录不要带上f盘,是相对于项目目录的路径。 **/09-source/02-CPMonitor/*.* 就是指项目目录下路径里包含有“/09-source/02-CPMonitor/”的所有文件。(不要带上F盘)

谢谢!
你说的路径问题,我再试试,虽然我好像都试过了,从“F:”开始一层层删除。。

另外我发现,可以在生成log的时候,就到指定的文件夹下去操作。所以只要不是需选取太多文件夹,就可以在生成log时就筛选出想要的路径、时间范围、版本范围。然后生成统计一部就不用限制路径了,log文件小,速度也快了很多~

恩,这样也行~这得“感谢”svn在每个目录下都弄一个 .svn隐藏目录。。。
ljzhappy2009
怎么同时选择多个目录啊,如同时选择多个目录下,A、B、C、D、E、F的代码统计情况
Day

引用来自“ljzhappy2009”的评论

怎么同时选择多个目录啊,如同时选择多个目录下,A、B、C、D、E、F的代码统计情况

-include **/*.cpp:**/*.h ,加include参数,每个目录用冒号隔开就行
ljzhappy2009
比如我想统计这几个目录下的代码,怎么写呀,我的目录太多了,会不会容易出错呀。D:\aa\svn\pay\trunk;D:\aa\svn\fanli\trunk;D:\aa\svn\5053\5053-android\trunk
Day

引用来自“ljzhappy2009”的评论

比如我想统计这几个目录下的代码,怎么写呀,我的目录太多了,会不会容易出错呀。D:\aa\svn\pay\trunk;D:\aa\svn\fanli\trunk;D:\aa\svn\5053\5053-android\trunk

StatSVN是读取svn一个项目的日志生成统计的,你那些目录是不同工程的么?不同工程最好每个工程一个页面,用shell对每个项目进行一次统计就可以了
ljzhappy2009
谢谢,我再去试一试。其实我的最终目的是统计不同开发人员写的代码行数(这些代码在10几个文件夹下面,一个库里。因为有前端后端各处的代码),其实这样的统计除了用StatSVN外,还有无其它实用工具,或者用shell脚本也可实现?
ljzhappy2009
java -jar ..\statsvn.jar ..\ddd.log ..\svn -include **\505\505-android\trunk\*.*:**\fanli\trunk\*.*:**\pay\trunk\front\*.*:**\pay\trunk\server\*.*:**\pay\trunk\web\*.*:**\yxq\web\trunk\*.*:**\yxq\yxq-android\trunk\*.*
用这个统计出来的值都是不正确的,比实际的代码量少了很多,很多~
Day

引用来自“ljzhappy2009”的评论

谢谢,我再去试一试。其实我的最终目的是统计不同开发人员写的代码行数(这些代码在10几个文件夹下面,一个库里。因为有前端后端各处的代码),其实这样的统计除了用StatSVN外,还有无其它实用工具,或者用shell脚本也可实现?

一个库是可以同时统计的,一个库svn日志文件是同一个,statsvn是对一份日志进行分析的,只要设置好 -include -exclude 包含或剔除一些文件夹就可以了,svn现在没怎么用了,用git了...
Day

引用来自“ljzhappy2009”的评论

java -jar ..\statsvn.jar ..\ddd.log ..\svn -include **\505\505-android\trunk\*.*:**\fanli\trunk\*.*:**\pay\trunk\front\*.*:**\pay\trunk\server\*.*:**\pay\trunk\web\*.*:**\yxq\web\trunk\*.*:**\yxq\yxq-android\trunk\*.*
用这个统计出来的值都是不正确的,比实际的代码量少了很多,很多~

比如 **\fanli\trunk\*.* 表示统计trunk目录下的包含点的文件,不包含字目录的~应该是这个问题,可以试试**\fanli\trunk\**(无点)
ljzhappy2009
如果想既过滤那些目录,又过滤那些格式呢?
比如过滤:yxq\yxq-android\trunk\**:**\505\505-android\trunk\**,又过滤这些目录下的**/*.cpp:**/*.h:**/*.hpp:**/*.c:**/*.cxx:**这些文件,怎么写呀
lb0511225
报表主页那个total 行数,和以程序员各自代码行相加所得的总行数值不一致呢, 那个是准确的呢
×
Day
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: