git リポジトリのコード行履歴をグラフ化するにはどうすればよいですか?
-
09-06-2019 - |
質問
基本的に、各コミット後にリポジトリ内のコード行数を取得したいと考えています。
私が見つけた唯一の(本当にくだらない)方法は、 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 のコードの合計行数が得られるはずです。
それは何か役に立ちますか?あなたの質問について何か誤解をしているような気がします。