如何绘制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为我开箱即用。