दिलचस्प पोस्ट
ExpandableListView – बच्चों के साथ समूहों के लिए छुपाएं सूचक लंबितइंन्टेंट पहली सूचना के लिए सही तरीके से काम करता है लेकिन शेष के लिए गलत तरीके से काम करता है माइक्रोसॉफ्ट जेट वाइल्डकार्ड: तारांकन या प्रतिशत चिन्ह? VBA, ADO.Connection और क्वेरी पैरामीटर Chrome.notifications API को कुछ सेकंड के बाद मेरी सूचना को छुपाने से रोकें जावा में यूज़र-डिफ़ाइंड टाइप को शामिल करने वाले ओरेकल स्टोर की प्रक्रिया को कैसे कॉल करें? कैसे जावास्क्रिप्ट में खिड़की के आकार परिवर्तन घटना ट्रिगर करने के लिए? एक्सेल में किसी भिन्न फ़ॉन्ट रंग का पाठ कैसे गिनें क्या कोई एपीआई है कि फेसबुक को एक पृष्ठ फिर से स्क्रैप करने के लिए मजबूर किया जाए? एक लूप में कार्य बनाना जावास्क्रिप्ट के साथ रेडियो बटन मूल्य प्राप्त करें एंड्रॉइड मीडियाप्लेयर / विडियो व्यू त्रुटि (1, -2147483648) पूर्णांक हैश फ़ंक्शन क्या अच्छा है जो कि पूर्णांक हैश कुंजी स्वीकार करता है? जावा में Google ड्राइव में Google स्प्रेडशीट एपीआई का उपयोग करते हुए स्प्रैडशीट बनाएं गिट में एक फ़ाइल का संशोधन समय पुनर्स्थापित करें

गिट का दोष: आंकड़े

मैं प्रत्येक कम्यूटेटर से उत्पन्न होने वाली रिपॉजिटरी में कितनी लाइनों (कोड) का एक आंकड़ा देने के लिए कैसे "दुरुपयोग" दोष (या कुछ बेहतर उपयुक्त फ़ंक्शन, और / या शेल कमांड के साथ संयोजन में) कर सकता हूं?

उदाहरण आउटपुट:

Committer 1: 8046 Lines Committer 2: 4378 Lines 

वेब के समाधान से एकत्रित समाधान "गिट का दोष: आंकड़े"

अद्यतन करें

 git ls-tree -r -z --name-only HEAD -- */*.c | xargs -0 -n1 git blame \ --line-porcelain HEAD |grep "^author "|sort|uniq -c|sort -nr 

मैंने रास्ते पर कुछ चीजें अपडेट कीं।

आलसी के लिए आप इसे अपने आदेश में भी डाल सकते हैं:

 #!/bin/bash # save as ie: git-authors and set the executable flag git ls-tree -r -z --name-only HEAD -- $1 | xargs -0 -n1 git blame \ --line-porcelain HEAD |grep "^author "|sort|uniq -c|sort -nr 

इस जगह को अपने रास्ते में रखें या अपने पथ को संशोधित करें और इसे पसंद करें

  • git authors '*/*.c' # look for all files recursively ending in .c
  • git authors '*/*.[ch]' # look for all files recursively ending in .c or .h
  • git authors 'Makefile' # just count lines of authors in the Makefile

मूल उत्तर

जबकि स्वीकार किए जाते हैं उत्तर काम करता है यह बहुत धीमा है

 $ git ls-tree --name-only -z -r HEAD|egrep -z -Z -E '\.(cc|h|cpp|hpp|c|txt)$' \ |xargs -0 -n1 git blame --line-porcelain|grep "^author "|sort|uniq -c|sort -nr 

लगभग तात्कालिक है

वर्तमान में ट्रैक की गई फ़ाइलों की सूची प्राप्त करने के लिए आप उपयोग कर सकते हैं

 git ls-tree --name-only -r HEAD 

यह समाधान file प्रकार को निर्धारित करने के लिए file को कॉल करने से बचाता है और प्रदर्शन के कारणों के लिए वांछित विस्तार से मिलान करने के लिए grep का उपयोग करता है अगर सभी फ़ाइलें शामिल की जानी चाहिए, तो बस इसे लाइन से हटा दें

 grep -E '\.(cc|h|cpp|hpp|c)$' # for C/C++ files grep -E '\.py$' # for Python files 

अगर फ़ाइलों में रिक्त स्थान हो सकते हैं, जो कि गोले के लिए खराब होते हैं, जिनका उपयोग आप कर सकते हैं:

 git ls-tree -z --name-only -r HEAD | egrep -Z -z '\.py'|xargs -0 ... # passes newlines as '\0' 

फ़ाइलों की एक सूची दीजिए (एक पाइप के माध्यम से) एक कमांड को कॉल करने के लिए एक्सरस का उपयोग कर सकते हैं और तर्क वितरित कर सकते हैं। कमांड जो कि कई फ़ाइलों को संसाधित करने की अनुमति देता है- -n1 इस मामले में हम git blame --line-porcelain और प्रत्येक कॉल के लिए हम बिल्कुल 1 तर्क का उपयोग करते हैं।

 xargs -n1 git blame --line-porcelain 

हम तब "लेखक" की घटनाओं के लिए आउटपुट फ़िल्टर करते हैं और सूची को क्रमबद्ध करते हैं और इनकी नकल करते हैं:

 grep "^author "|sort|uniq -c|sort -nr 

ध्यान दें

अन्य उत्तर वास्तव में उन लाइनों को फ़िल्टर करते हैं जिनमें केवल सफेद स्थान होते हैं

 grep -Pzo "author [^\n]*\n([^\n]*\n){10}[\w]*[^\w]"|grep "author " 

उपर्युक्त कमांड लाइनों के लेखकों को मुद्रित करेगा जिसमें कम से कम एक गैर-व्हाइटस्पेस वर्ण होगा। आप मैच \w*[^\w#] का भी उपयोग कर सकते हैं, जिसमें लाइनों को भी शामिल नहीं किया जाएगा जहां पहले गैर-व्हाइटप्रेस वर्ण # (अनेक स्क्रिप्टिंग भाषाओं में टिप्पणी नहीं) नहीं है।

मैंने git-fame नामक एक मणि लिखा था जो उपयोगी हो सकता है।

स्थापना और उपयोग:

  1. $ gem install git_fame
  2. $ cd /path/to/gitdir
  3. $ git fame

आउटपुट:

 Statistics based on master Active files: 21 Active lines: 967 Total commits: 109 Note: Files matching MIME type image, binary has been ignored +----------------+-----+---------+-------+---------------------+ | name | loc | commits | files | distribution (%) | +----------------+-----+---------+-------+---------------------+ | Linus Oleander | 914 | 106 | 21 | 94.5 / 97.2 / 100.0 | | f1yegor | 47 | 2 | 7 | 4.9 / 1.8 / 33.3 | | David Selassie | 6 | 1 | 2 | 0.6 / 0.9 / 9.5 | +----------------+-----+---------+-------+---------------------+ 
 git ls-tree -r HEAD|sed -re 's/^.{53}//'|while read filename; do file "$filename"; done|grep -E ': .*text'|sed -r -e 's/: .*//'|while read filename; do git blame -w "$filename"; done|sed -r -e 's/.*\((.*)[0-9]{4}-[0-9]{2}-[0-9]{2} .*/\1/' -e 's/ +$//'|sort|uniq -c 

कदम से कदम विवरण:

संस्करण नियंत्रण के तहत सभी फाइलों को सूचीबद्ध करें

 git ls-tree -r HEAD|sed -re 's/^.{53}//' 

सूची को केवल पाठ फाइलों पर छापें

 |while read filename; do file "$filename"; done|grep -E ': .*text'|sed -r -e 's/: .*//' 

गीट सभी पाठ फ़ाइलों को दोषी ठहराता है, व्हाटस्पेस परिवर्तनों को छोड़कर

 |while read filename; do git blame -w "$filename"; done 

लेखक के नामों को हटा दें

 |sed -r -e 's/.*\((.*)[0-9]{4}-[0-9]{2}-[0-9]{2} .*/\1/' -e 's/ +$//' 

लेखकों की सूची को सॉर्ट करें, और लगातार दोहराए जाने वाली लाइनों की संख्या की गणना करें

 |sort|uniq -c 

उदाहरण आउटपुट:

  1334 Maneater 1924 Another guy 37195 Brian Ruby 1482 Anna Lambda 
 git summary --line 

जीआईटी-एक्स्ट्रास पैकेज से आप की ज़रूरत है।

Git-extras – git-summary पर प्रलेखन चेकआउट करें

आउटपुट इस तरह दिखेगा:

 project : TestProject lines : 13397 authors : 8927 John Doe 66.6% 4447 Jane Smith 33.2% 23 Not Committed Yet 0.2% 

एरिक का समाधान भयानक था, लेकिन मुझे LC_* साथ कुछ समस्याएं थीं (मेरे LC_* पर्यावरण चर के बावजूद स्पष्ट रूप से सेट किए जाने के बावजूद) मेरा एसएडी-फू खराब है, इसलिए मैं इस फ्रैंकेंस्टीन स्निपेट के साथ रूबी के साथ समाप्त हुआ, लेकिन यह मेरे लिए 200,000 ओ.ए.ओ. पर निरर्थक ढंग से काम करता है, और यह परिणामों को ठीक करता है:

 git ls-tree -r HEAD | gsed -re 's/^.{53}//' | \ while read filename; do file "$filename"; done | \ grep -E ': .*text' | gsed -r -e 's/: .*//' | \ while read filename; do git blame "$filename"; done | \ ruby -ne 'puts $1.strip if $_ =~ /^\w{8} \((.*?)\s*\d{4}-\d{2}-\d{2}/' | \ sort | uniq -c | sort -rg 

इसके अलावा sed बजाय gsed नोट करें क्योंकि यह द्विआधारी homebrew स्थापित है, सिस्टम को छोड़कर बरकरार है

git shortlog -sn

यह प्रत्येक लेखक की एक सूची दिखाएगा।

http://gitstats.sourceforge.net/ पर उपलब्ध gitstats कमांड देखें

यहां @ एलेक्स के उत्तर से प्राथमिक स्निपेट है जो वास्तव में दोष लाइनों को एकत्र करने का संचालन करता है मैंने फाइलों के सेट की बजाय एक फाइल पर काम करने के लिए इसे काट दिया है

 git blame --line-porcelain path/to/file.txt | grep "^author " | sort | uniq -c | sort -nr 

मैं इसे यहां पोस्ट करता हूं क्योंकि मैं अक्सर इस उत्तर पर वापस आती हूं और पोस्ट को पुनः पढ़ रहा हूं और उदाहरणों को पुनः प्राप्त करने के लिए उस भाग को निकालने के लिए मानता हूं कि यह कर लगाना है। यह मेरे उपयोग के मामले के लिए पर्याप्त सामान्य नहीं है; इसका दायरा पूरे सी परियोजना के लिए है


मुझे हर फ़ाइल को आंकड़े सूचीबद्ध करना पसंद है, जिसे एक्सर के बजाय इटरेटर के for बैश के माध्यम से हासिल किया गया है, क्योंकि मुझे कम पढ़ने योग्य और याद रखना / पढ़ने के लिए मुश्किल लगता है, लाभ / नुकसान के लिए एक्सरस बनाम कहीं और पर चर्चा की जानी चाहिए।

यहां एक व्यावहारिक स्निपेट है जो व्यक्तिगत रूप से प्रत्येक फ़ाइल के परिणाम दिखाएगा:

 for file in $(git ls-files); do \ echo $file; \ git blame --line-porcelain $file \ | grep "^author " | sort | uniq -c | sort -nr; \ echo; \ done 

और मैंने परीक्षण किया, इस समस्या को एक बैश शेल में चलाना ctrl + c सुरक्षित है, अगर आपको इसे एक बाँश स्क्रिप्ट के अंदर रखना चाहिए, तो आपको SIGINT और SIGTERM पर ट्रैप की आवश्यकता हो सकती है अगर आप उपयोगकर्ता को लूप के लिए तोड़ने में सक्षम होना चाहते हैं।

मेरे पास यह समाधान है जो सभी पाठ फ़ाइलों में दोषपूर्ण लाइनों की गणना करता है (बाइनरी फ़ाइलों को छोड़कर, यहां तक ​​कि संस्करण वाले):

 IFS=$'\n' for file in $(git ls-files); do git blame `git symbolic-ref --short HEAD` --line-porcelain "$file" | \ grep "^author " | \ grep -v "Binary file (standard input) matches" | \ grep -v "Not Committed Yet" | \ cut -d " " -f 2- done | \ sort | \ uniq -c | \ sort -nr 

मेरी स्वयं की स्क्रिप्ट बना दी जो कि @ नीलबस और @ एलेक्स का एक संयोजन है

 #!/bin/sh for f in $(git ls-tree -r --name-only HEAD --); do j=$(file "$f" | grep -E ': .*text'| sed -r -e 's/: .*//'); if [ "$f" != "$j" ]; then continue; fi git blame -w --line-porcelain HEAD "$f" | grep "^author " | sed 's/author //'`enter code here` done | sort | uniq -c | sort -nr