Python 如何绘制git repo的代码历史记录行?
基本上,我希望在每次提交后获得存储库中的代码行数 我发现的唯一(真正糟糕的)方法是使用Python 如何绘制git repo的代码历史记录行?,python,ruby,git,lines-of-code,Python,Ruby,Git,Lines Of Code,基本上,我希望在每次提交后获得存储库中的代码行数 我发现的唯一(真正糟糕的)方法是使用git过滤器分支运行wc-l*,以及在每次提交时运行git reset--hard的脚本,然后运行wc-l 更清楚地说,当该工具运行时,它将输出第一次提交的代码行,然后是第二次提交的代码行,依此类推。这就是我希望工具输出的内容(作为示例): me@something:~/$gitsloc—分支主控 10 48 153 450 1734 1542 我已经使用过ruby'git'库,但是我发现最接近的方法是在di
git过滤器分支
运行wc-l*
,以及在每次提交时运行git reset--hard
的脚本,然后运行wc-l
更清楚地说,当该工具运行时,它将输出第一次提交的代码行,然后是第二次提交的代码行,依此类推。这就是我希望工具输出的内容(作为示例):
me@something:~/$gitsloc—分支主控
10
48
153
450
1734
1542
我已经使用过ruby'git'库,但是我发现最接近的方法是在diff上使用.lines()
方法,它似乎应该给出添加的行(但是没有:例如,当删除行时,它返回0)
需要“rubygems”
需要“git”
总数=0
g=Git.open(working_dir='/Users/dbr/Desktop/code_projects/tvdb_api')
最后=零
g、 log.each do|cur|
差异=g.diff(最后,当前)
总计=总计+差异线
总计
last=cur
结束
首先想到的是您的git历史可能具有非线性历史。您可能难以确定合理的提交顺序
话虽如此,您似乎可以在提交中保存提交ID和相应代码行的日志。在post-commit钩子中,从HEAD修订开始,向后工作(必要时分支到多个父级),直到所有路径都达到您以前见过的提交。这将为您提供每个提交id的代码行总数
这有帮助吗?我觉得我误解了您的问题。您可能会在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))
您也可以考虑,它将此图生成为HTML文件。 对我来说是开箱即用的。
如果不是line.strip():continue
可能更健壮。argv
在main()
中没有使用(复制自旧答案),这太完美了!我本来打算用Python编写它,但我碰巧安装了RubyGit库,所以尝试用它来完成。谢谢只需对print语句进行一些小的更改,我就可以将输出保存到一个.csv文件中,并将其放入谷歌文档/电子表格中,生成一个图形!它并不完全完美,因为它将注释和docstring作为代码来计算,我不知道它将如何处理二进制文件。。但是,作为一个脚本,我可以在任何存储库上运行,而不需要复杂的提交后挂钩等等,这太棒了!这个答案中的正则表达式似乎不再有效。git日志消息有时不包括删除或插入。在合并提交时,此脚本可能无法获得正确的代码行。因为您按相反的时间顺序获得提交,然后逐个遍历它们。但是对于合并的提交,您不能保证最后一次提交是当前提交的父级。它确实会生成一个#行的图形,但它非常小。(@omouse-它也会按日期发送一个#行的数据文件,您可以在自己选择的应用程序中绘制该文件)请注意,当前给定的脚本无法正常工作。由于这是一条旧注释,并且出现了Python的新版本,因此该代码不能直接用于Python 3。