2008-08-23 15 views
40

मूल रूप से मैं प्रत्येक प्रतिबद्धता के बाद भंडार में लाइन-ऑफ-कोड की संख्या प्राप्त करना चाहता हूं।मैं गिट रेपो के लिए लाइन्स ऑफ कोड इतिहास कैसे ग्राफ कर सकता हूं?

केवल (वास्तव में भद्दा) तरीके मैं पाया है wc -l * चलाने के लिए git filter-branch उपयोग करने के लिए है, और एक स्क्रिप्ट है कि प्रत्येक के लिए प्रतिबद्ध पर git reset --hard चलाता है, तो wc -l

चलता है जब उपकरण है यह थोड़ा स्पष्ट बनाने के लिए, भागो, यह पहली प्रतिबद्धता के कोड की लाइनों को आउटपुट करेगा, फिर दूसरा और इसी तरह। यह मैं क्या उत्पादन के लिए उपकरण (एक उदाहरण के रूप में) चाहते हैं:

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

मैं चारों ओर गहरे लाल रंग का '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 

उत्तर

23

तुम भी gitstats है, जो एक HTML फ़ाइल के रूप में इस ग्राफ को उत्पन्न करता है सोच सकते हैं।

+0

यह वास्तव में लाइनों के # ग्राफ का उत्पादन करता है लेकिन यह बहुत छोटा है। –

+2

(@omouse - यह दिनांक डेटा फ़ाइल द्वारा लाइनों में से # को भी उत्सर्जित करता है, जिसे आप अपनी पसंद के ऐप में ग्राफ़ कर सकते हैं) – Rich

4

पहली बात यह है कि मन में कूदता अपना Git इतिहास एक nonlinear इतिहास होने की संभावना है। आपको प्रतिबद्धता के एक समझदार अनुक्रम का निर्धारण करने में कठिनाई हो सकती है।

ऐसा कहकर, ऐसा लगता है कि आप उस प्रतिबद्धता में कोड आईडी और कोड की इसी पंक्ति को लॉग रख सकते हैं। एक पोस्ट-प्रतिबद्ध हुक में, HEAD संशोधन से शुरू होने पर, पीछे की ओर काम करें (यदि आवश्यक हो तो कई माता-पिता को ब्रांच करना) जब तक कि सभी पथ पहले से पहले देखे गए प्रतिबद्धता तक पहुंच न जाएं। इससे आपको प्रत्येक प्रतिबद्ध आईडी के लिए कोड की कुल पंक्तियां मिलनी चाहिए।

क्या इससे कोई मदद मिलती है? मुझे एहसास है कि मैंने आपके प्रश्न के बारे में कुछ गलत समझा है। Git लॉग साथ

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' हमेशा आपके कोड में 'कोई नहीं' होगा। – jfs

+0

'यदि लाइन नहीं है। स्ट्रिप(): जारी रखें 'अधिक मजबूत हो सकता है। – jfs

+0

'argv' का उपयोग मुख्य()' – jfs

संबंधित मुद्दे

 संबंधित मुद्दे