如何绘制git repo的代码行历史记录?
时间:2020-03-05 18:42:20 来源:igfitidea点击:
基本上,我想在每次提交后获取存储库中的代码行数。
我发现的唯一(非常糟糕的)方法是使用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
解决方案
回答
首先想到的是git历史记录具有非线性历史记录的可能性。我们可能难以确定明智的提交顺序。
话虽如此,看来我们可以保留提交ID和该提交中相应代码行的日志。从HEAD版本开始,在提交后的钩子中,向后进行操作(如有必要,分支到多个父级),直到所有路径都达到了我们之前已经看到的提交。这应该为我们提供每个提交ID的总代码行。
这有帮助吗?我觉得我对问题误解了。
回答
我们可能会同时使用git log添加和删除行,例如:
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))
回答
我们可能还考虑了gitstats,它将此图生成为html文件。
回答
http://github.com/ITikhonov/git-loc为我开箱即用。