git リポジトリのコード行履歴をグラフ化するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/23907

質問

基本的に、各コミット後にリポジトリ内のコード行数を取得したいと考えています。

私が見つけた唯一の(本当にくだらない)方法は、 git filter-branch 走る wc -l *, 、および実行されるスクリプト git reset --hard コミットごとに実行されます wc -l

もう少しわかりやすくするために、ツールを実行すると、最初のコミットのコード行が出力され、次に 2 番目のコミットというように出力されます。これは、ツールで出力したいものです(例として)。

me@something:~/$ gitsloc --branch master
10
48
153
450
1734
1542

Ruby の「git」ライブラリを試してみましたが、私が見つけた最も近いものは、 .lines() diff のメソッド。追加された行が表示されるように見えますが、そうではありません。たとえば行を削除すると 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
役に立ちましたか?

解決

検討することもできます gitstats, 、このグラフを HTML ファイルとして生成します。

他のヒント

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))

http://github.com/ITikhonov/git-loc 私にとっては箱から出してすぐにうまくいきました。

最初に思い浮かぶのは、Git 履歴に非線形履歴がある可能性です。賢明なコミットの順序を決定するのが難しい場合があります。

そうは言っても、コミット ID とそのコミット内の対応するコード行のログを保持できるようです。コミット後のフックでは、HEAD リビジョンから開始して、すべてのパスが以前に確認したコミットに到達するまで逆方向に作業します (必要に応じて複数の親に分岐します)。これにより、各コミット ID のコードの合計行数が得られるはずです。

それは何か役に立ちますか?あなたの質問について何か誤解をしているような気がします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top