Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何绘制git repo的代码历史记录行?_Python_Ruby_Git_Lines Of Code - Fatal编程技术网

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。