2008-08-23 10 views
40

基本的には、コミット後にリポジトリ内のコード行数を取得したいと考えています。git repoのコード行履歴をグラフ化するにはどうすればよいですか?

私が発見しただけ(本当にくだらない)の方法はwc -l *を実行するためにgit filter-branchを使用することで、それぞれにgit reset --hardをコミットを実行するスクリプトは、その後、ツールがあるとき、それは少し明確にするためにwc -l

を実行します実行すると、最初のコミットのコード行を出力し、次に2番目のコミットコードを出力します。これは私が(例として)出力するツールを望むものである:

[email protected]:~/$ gitsloc --branch master 
10 
48 
153 
450 
1734 
1542 

私はルビー「gitの」ライブラリと周りにプレイしましたが、私が見つけた最も近い差分に.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 

答えて

23

また、htmlファイルとして、このグラフを生成gitstatsを、考えるかもしれません。

+0

それは本当に線グラフの#を生成しますが、それはかなり小さいです。 –

+2

(@omouse - 日付のデータファイルで#行も出力します。これは任意のアプリケーションでグラフ化できます) – Rich

4

心にジャンプする最初の事はあなたのgitの履歴は、非線形歴史を持つ可能性があります。分かりやすい一連のコミットを判断するのは難しいかもしれません。

あなたがコミットIDとそのコミットに対応するコード行のログを保持できるようだと言われています。コミット後のフックでは、HEADリビジョンから始めて、すべてのパスが以前に見たコミットに達するまで、逆方向に作業します(必要に応じて複数の親に分岐します)。それはあなたに各コミットIDのコードの合計行を与える必要があります。

これは役に立ちますか?私はあなたの質問について何か誤解していると感じています。

23

あなたの両方が追加され、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)) 
+0

'err'はあなたのコードでは常に' None'になります。 – jfs

+0

'line.strip():continue'でない場合は、より堅牢である可能性があります。 – jfs

+0

'argv'は' main() 'で使用されていません – jfs

関連する問題