2008-08-23 4 views
40

기본적으로 각 커밋 후에 저장소의 코드 줄 수를 가져 오려고합니다. git repo에 대한 코드 라인 기록을 어떻게 그래프로 나타낼 수 있습니까?

내가 찾은 유일한 (정말 엉터리) 방법

wc -l *을 실행하는 데 git filter-branch을 사용하는 것입니다, 각 커밋에 git reset --hard를 실행하는 스크립트는 다음 도구를 때, 그것은 조금 명확하게하기 위해 wc -l

를 실행 실행하면 첫 번째 커밋 코드를 출력하고 두 번째 커밋 코드를 출력합니다. 이것은 내가 (예를 들어) 출력 도구 원하는 것입니다 :

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

내가 루비 '자식'라이브러리와 주변 해본 적이,하지만 내가하는 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 

답변

23

또한 HTML 파일로 그래프를 생성 gitstats을 고려할 수 있습니다.

+0

실제로 선 그래프 수를 생성하지만 꽤 작습니다. –

+2

(@omouse - 선택한 응용 프로그램에서 그래프로 나타낼 수있는 날짜 데이터 파일별로 # 줄을 내 보냅니다.) – Rich

4

마음에 점프하는 첫번째 일은 당신의 자식 역사는 비선형 역사를 가지고있는 가능성이다. 현명한 커밋 순서를 결정하는 데 어려움이있을 수 있습니다.

그렇다고해서 커밋 ID 및 해당 커밋에 해당하는 코드 줄을 유지할 수있는 것처럼 보입니다. HEAD 개정판에서 시작하여 post-commit 후크에서 모든 경로가 이전에 보았던 커밋에 도달 할 때까지 거꾸로 작동합니다 (필요한 경우 여러 부모로 분기). 각 커밋 ID에 대한 총 코드 줄을 제공해야합니다.

그게 도움이되는가요? 내가 당신의 질문에 대해 오해 한 것 같은 느낌이 들었습니다. 같은 자식 로그와

23

당신은 모두 추가 및 제거 얻을 수 있습니다 라인이에서

git log --shortstat --reverse --pretty=oneline 

, 당신은이 정보를 사용했던 것과 유사한 스크립트를 작성할 수 있습니다. 파이썬에서 :

#!/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