python - text用法 - plt.title用法




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

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

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

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

[email protected]:~/$ 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的日志和相应的代码行。 在一个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))





lines-of-code