2012-02-22 12 views
25

मैं कई लोगों द्वारा लिखे गए एक कार्यक्रम पर काम कर रहा हूं जिसमें काफी हद तक कौशल स्तर है। वहां ऐसी फाइलें हैं जो कभी नहीं बदली हैं (और शायद कभी नहीं, क्योंकि हम उन्हें छूने से डरते हैं) और अन्य जो लगातार बदल रहे हैं।कोड परिवर्तन आवृत्ति का पता लगाने के लिए कैसे?

मुझे आश्चर्य है, क्या वहां कोई उपकरण है जो पूरे रेपो इतिहास (git) को देखेगा और विश्लेषण करेगा कि किसी दिए गए फ़ाइल में कितनी बार परिवर्तन होता है? या पैकेज? या परियोजना?

यह पहचानने के लिए मूल्य होगा (उदाहरण के लिए) हमने अपने समय का 25% पैकेजों के एक सेट पर काम किया है, जो "बस काम करता है" कोड की तुलना में संकेतक या कोड की नाजुकता होगी।

उत्तर

5

मैंने कुछ लिखा है जिसे हम सफलतापूर्वक इस जानकारी को देखने के लिए उपयोग करते हैं।

https://github.com/bcarlso/defect-density-heatmap

परियोजना पर एक नजर डालें और आप देख सकते हैं उत्पादन रीडमी पर कैसा होता है।

आप गिट से प्रत्येक प्रतिबद्धता में परिवर्तित फ़ाइलों की सूची प्राप्त करने के लिए जो कुछ भी कर सकते हैं, वह कर सकते हैं।

~ $ git log --pretty="format:" --name-only | grep -v ^$ > file-changes.txt 

~ $ for i in `cat file-changes.txt | cut -d"." -f1,2 | uniq`; do num=`cat file-changes.txt | grep $i | wc -l`; if (($num > 1)); then echo $num,0,$i; fi; done | heatmap > results.html 

यह आपको उन फ़ाइलों के साथ टैग क्लाउड देगा जो अधिक मंथन दिखाएंगे।

+2

दूसरा बिट वास्तव में अच्छी तरह से स्केल नहीं करता है। 'सॉर्ट फ़ाइल-परिवर्तन.txt | uniq -c | sed -e's/^ * //' -e 's//, 0, /'> heatmap.in' या उस प्रभाव के लिए कुछ तेज़ होना चाहिए। – cdegroot

11

यदि आप ओएस समाधान की तलाश में हैं, तो शायद मैं gitstats से शुरू करने पर विचार करता हूं और फ़ाइल लॉग को पकड़कर और उस डेटा को एकत्रित करके इसे विस्तारित करना चाहता हूं।

+1

मैंने विशेष रूप से गिटस्टैट्स 'मर्ज_एथर्स' सुविधा की सराहना की, जो सफाई करने में सक्षम बनाता है जहां एक ही व्यक्ति ने विभिन्न लेखक नामों के तहत किया है। सीएफ https://gitorious.org/gitstats/mainline/commit/005fe0bbcab967367e4932d11b161f9f0f71cf7f –

4

मैं की तरह

git log --follow -p file 

है कि आप सभी परिवर्तन (renames सहित) इतिहास में फाइल करने के लिए हुआ दे देंगे एक आदेश का उपयोग कर सुझाव देते हैं। आप प्रतिबद्ध है कि फ़ाइल बदल तो आप एक यूनिक्स आधारित OS पर कर सकते हैं की संख्या प्राप्त करना चाहते हैं:

git log --follow --format=oneline Gemfile | wc -l 

फिर आप नाम एक तरफ से एक से अधिक फ़ाइलों को यह लागू करने के लिए एक पार्टी स्क्रिप्ट बना सकते हैं।

आशा है कि इससे मदद मिलेगी!

+0

इतना सुरुचिपूर्ण लेकिन सरल और कामकाजी समाधान (1+) नहीं है। – AoeAoe

+0

वास्तव में अच्छा है। धन्यवाद! – Ashitaka

8

मैं NChurn पर एक नजर है चाहते हैं:

NChurn एक उपयोगिता है कि गधे अपने भंडार में आपकी फ़ाइलों के मंथन के स्तर में मदद करता है। चर्न आपको यह जानने में मदद कर सकता है कि अपने जीवनकाल में कौन सी फाइलें बदली गई हैं। यह संभावित बग हाइव्स और अनुचित डिज़ाइन की पहचान करने में सहायता करता है। सबसे अच्छी बात यह है कि एनसीएचर्न को अपने निर्माण प्रक्रिया में प्रत्येक रन की प्रक्रिया और स्टोर इतिहास में प्लग करना है। फिर, आप अपने भंडार के मंथन के विकास को साजिश कर सकते हैं।

+0

+1; यह गिटस्टैट में एकीकृत देखने के लिए अच्छा लगा। –

+0

एनकहर्न अच्छी तरह से काम करता है - और यह तेजी से चलता है। यह रेपो में दिनांक सीमा के लिए प्रति फ़ाइल चेकइन की संख्या की गणना करता है। (इसे एक छोटा एनपीई फिक्स चाहिए, या "बहिष्कृत" सूची शामिल करना सुनिश्चित करें)। –

2

भवन पिछले एक जवाब पर मैं निम्न स्क्रिप्ट का सुझाव सभी परियोजना फ़ाइलों

#!/bin/sh 
cd $1 
find . -path ./.git -prune -o -name "*" -exec sh -c 'git log --follow --format=oneline $1 | wc -l | awk "{ print \$1,\"\\t\",\"$1\" }" ' {} {} \; | sort -nr 
cd .. 

पार्स करने के लिए आप file_churn के रूप में स्क्रिप्ट को कॉल करते हैं।sh आप

> ./file_churn.sh project_dir 
> ./file_churn.sh project_dir 

पर कॉल करने में आपकी गिट प्रोजेक्ट निर्देशिका को पार्स कर सकते हैं।

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