如何修改gitstats以仅使用指定的文件扩展名进行统计?
这个统计生成器的网站是:
http://gitstats.sourceforge.net/
它的代码库可以从这里克隆:
git clone git://repo.or.cz/gitstats.git
我想做的事情类似于:
./gitstatus --ext=".py" /input/foo /output/bar
如果不能轻松地传递上面的选项而不进行大改动,我就打算直接把我想要包含的文件扩展名写死在代码里。
不过,我不太确定应该修改哪一部分代码,即使我知道了,我也不知道该怎么开始修改。
这看起来应该挺简单的,但可惜……
2 个回答
编辑: 显然,下面的解决方案只影响“文件”统计页面,这个不太重要。我在寻找更好的方法。我们需要修复的那行是第254行,如下:
lines = getpipeoutput(['git rev-list --pretty=format:"%%at %%ai %%aN <%%aE>" %s' % getcommitrange('HEAD'), 'grep -v ^commit']).split('\n')
之前的尝试是:
不幸的是,git似乎没有提供简单的选项来按提交中的文件进行过滤(在git log和git rev-list中)。这个解决方案并没有真正过滤特定文件类型的所有统计数据(比如标签的统计),但确实对计算按更改行数的活动部分进行了过滤。
所以我能想到的最好方法是在gitstats的第499行(主脚本):
res = int(getpipeoutput(['git ls-tree -r --name-only "%s"' % rev, 'wc -l']).split('\n')[0])
你可以通过在命令中添加一个管道到grep来改变这个,像这样:
res = int(getpipeoutput(['git ls-tree -r --name-only "%s"' % rev, 'grep \\.py$', 'wc -l']).split('\n')[0])
或者,你可以把'wc -l'部分分开,把git ls-tree的输出变成一个字符串列表,然后使用fnmatch模块过滤结果中的文件名(然后可能通过使用'wc -l'来计算每个文件的行数),但这对你想解决的具体问题来说似乎有点过于复杂。
不过,这仍然没有解决问题(其余的统计数据会忽略这个过滤),但希望能对你有所帮助。
今天我在找同样的东西时发现了这个问题。在看了sinelaw的回答后,我查看了代码,最后决定把这个项目复制了一份。
https://github.com/ShawnMilo/GitStats
我添加了一个“exclude_extensions”的配置选项。这个选项并不是对所有输出部分都有影响,但已经在朝着那个方向发展了。
一旦我完全理解它是如何处理git输出的,我可能会进行一次比较大的重写。这个原始项目大约在四年前的今天开始,由于标准库和Python语言的许多更新,有很多地方可以进行清理。