2008-08-23 84 views
40

基本上我想在每次提交之后获取版本库中的代码行数。如何绘制git repo的代码行历史记录?

我发现的唯一的(真糟糕)的方法是使用git filter-branch运行wc -l *,而且每次提交运行git reset --hard的脚本,然后运行wc -l

为了使它更清楚一点,当刀具运行时,它会输出第一次提交的代码行,然后输出第二次提交的代码行等等。这就是我想要的工具输出(作为一个例子):

[email protected]:~/$ gitsloc --branch master 
10 
48 
153 
450 
1734 
1542 

我和红宝石“混帐”库玩耍了,但我发现用在一个diff的.lines()方法,最接近其似乎应该给所添加的行(但不:当你删除例如线返回0)

require 'rubygems' 
require 'git' 

total = 0 
g = Git.open(working_dir = '/Users/dbr/Desktop/code_projects/tvdb_api')  

last = nil 
g.log.each do |cur| 
    diff = g.diff(last, cur) 
    total = total + diff.lines 
    puts total 
    last = cur 
end 

回答

4

跳转想到的第一件事是具有非线性历史的git的历史的可能性。您可能难以确定合理的提交顺序。

话虽如此,好像你可以在提交中保存提交id和相应代码行的日志。在一个post-commit钩子中,从HEAD修订开始,向后工作(如果需要的话,分支到多个父项),直到所有路径达到您之前已经见过的提交。这应该为您提供每个提交ID的代码总行数。

这有帮助吗?我有一种感觉,我误解了你的问题。

23

您可能会同时添加和删除的那些行用git的日志,如:

git log --shortstat --reverse --pretty=oneline 

由此看来,你可以写一个类似的脚本来你没有使用这个信息的人。在蟒蛇:

#!/usr/bin/python 

""" 
Display the per-commit size of the current git branch. 
""" 

import subprocess 
import re 
import sys 

def main(argv): 
    git = subprocess.Popen(["git", "log", "--shortstat", "--reverse", 
         "--pretty=oneline"], stdout=subprocess.PIPE) 
    out, err = git.communicate() 
    total_files, total_insertions, total_deletions = 0, 0, 0 
    for line in out.split('\n'): 
    if not line: continue 
    if line[0] != ' ': 
     # This is a description line 
     hash, desc = line.split(" ", 1) 
    else: 
     # This is a stat line 
     data = re.findall(
     ' (\d+) files changed, (\d+) insertions\(\+\), (\d+) deletions\(-\)', 
     line) 
     files, insertions, deletions = (int(x) for x in data[0]) 
     total_files += files 
     total_insertions += insertions 
     total_deletions += deletions 
     print "%s: %d files, %d lines" % (hash, total_files, 
             total_insertions - total_deletions) 


if __name__ == '__main__': 
    sys.exit(main(sys.argv)) 
+0

在你的代码中`err`将总是`None`。 – jfs 2009-01-14 13:06:03

+0

`如果不是line.strip():continue`可能会更健壮。 – jfs 2009-01-14 13:08:22

相关问题