如何绘制git repo的代码历史行?

基本上我想在每次提交之后获取版本库中的代码行数。

我发现的唯一(真正蹩脚的)方法是使用git filter-branch运行wc -l * ,并在每次提交时运行git reset --hard ,然后运行wc -l

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

 me@something:~/$ gitsloc --branch master 10 48 153 450 1734 1542 

我已经玩弄了ruby的'git'库,但是最近我发现在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 

你也可以考虑gitstats ,它将这个graphics生成为html文件。

你可能会得到添加和删除行与git日志,如:

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

从这里,你可以写一个类似的脚本,你使用这个信息。 在python中:

 #!/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)) 

首先想到的是你的git历史具有非线性历史的可能性。 您可能难以确定合理的提交顺序。

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

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