एक गिट रिपॉजिटरी में लाइनों की संख्या की गणना करें


766

मैं एक git रिपॉजिटरी में सभी फाइलों में मौजूद लाइनों की कुल संख्या कैसे गिनूंगा?

git ls-files मुझे git द्वारा ट्रैक की गई फ़ाइलों की एक सूची देता है।

मैं catउन सभी फाइलों के लिए कमांड ढूंढ रहा हूं । कुछ इस तरह

git ls-files | [cat all these files] | wc -l

जवाबों:


1139

xargs आप क्या चाहते हैं:

git ls-files | xargs cat | wc -l

लेकिन अधिक जानकारी और शायद बेहतर के साथ, आप यह कर सकते हैं:

git ls-files | xargs wc -l

11
मुझे लगता है तुच्छ; कैसे के बारे में केवल स्रोत कोड फ़ाइलें (जैसे * .cpp) शामिल हैं। हमारे पास कुछ बिन फाइलें प्रतिबद्ध हैं :)
डैनियल

39
grep cpp |वहाँ से पहले छड़ी xargs, फिर।
बजे कार्ल नॉरम सिप

35
उपयोग करें git ls-files -z | xargs -0 wc -lयदि आपके पास नाम में रिक्त स्थान वाली फाइलें हैं।
एमपोंटिल्लो

34
कुछ फ़ाइलों के उपयोग को छोड़कर / शामिल करने के लिए: git ls-files | grep -P ".*(hpp|cpp)" | xargs wc -lजहां grep हिस्सा कोई भी पर्ल प्रतिक्षेप है जो आप चाहते हैं!
गेब्रियल

29
अगर तुम सिर्फ जावा फ़ाइलों में रुचि रखते थे आप उपयोग कर सकते हैंgit ls-files | grep "\.java$" | xargs wc -l
dseibert

352
git diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904

यह खाली पेड़ से आपके वर्तमान कामकाजी पेड़ के अंतर को दर्शाता है। जो आपके वर्तमान कार्यशील पेड़ की सभी पंक्तियों को गिनने के लिए होता है।

अपने वर्तमान वर्किंग ट्री में नंबर पाने के लिए, यह करें:

git diff --shortstat `git hash-object -t tree /dev/null`

यह आपको एक स्ट्रिंग की तरह देगा 1770 files changed, 166776 insertions(+)


45
BTW, आप दौड़ कर उस हैश को प्राप्त कर सकते हैं git hash-object -t tree /dev/null
23

84
और इससे भी ज्यादा सक्सेसफुल:git diff --stat `git hash-object -t tree /dev/null`
रैप्ट्रीच

10
यह बेहतर समाधान है क्योंकि इसमें अभिलेखागार या छवियों जैसे द्विआधारी फ़ाइलों की गणना नहीं की जाती है जो ऊपर दिए गए संस्करण में गिने जाते हैं!
ब्रेनस्टोन

31
+1 मुझे यह समाधान बेहतर लगता है क्योंकि बायनेरिज़ की गिनती नहीं होती है। इसके अलावा, हम वास्तव में गिट डिफ आउटपुट की अंतिम पंक्ति में रुचि रखते हैं:git diff --stat `git hash-object -t tree /dev/null` | tail -1
गेब्रियल पेट्रोनेला

31
इसके बजाय git diff --shortstat `git hash-object -t tree /dev/null` अंतिम पंक्ति प्राप्त करने के लिए उपयोग करें, पूंछ की जरूरत नहीं है।
जिम वोल्फ

316

यदि आप यह गणना चाहते हैं क्योंकि आप परियोजना के दायरे का अंदाजा लगाना चाहते हैं, तो आप CLOC ("काउंट लाइन्स ऑफ कोड") के आउटपुट को प्राथमिकता दे सकते हैं , जो आपको भाषा द्वारा कोड की महत्वपूर्ण और महत्वहीन लाइनों का टूटना देता है।

cloc $(git ls-files)

(यह लाइन के बराबर है git ls-files | xargs cloc। यह का उपयोग करता है shके $()आदेश प्रतिस्थापन सुविधा।)

नमूना उत्पादन:

      20 text files.
      20 unique files.                              
       6 files ignored.

http://cloc.sourceforge.net v 1.62  T=0.22 s (62.5 files/s, 2771.2 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Javascript                       2             13            111            309
JSON                             3              0              0             58
HTML                             2              7             12             50
Handlebars                       2              0              0             37
CoffeeScript                     4              1              4             12
SASS                             1              1              1              5
-------------------------------------------------------------------------------
SUM:                            14             22            128            471
-------------------------------------------------------------------------------

आपको पहले CLOC स्थापित करनी होगी। आप शायद अपने पैकेज मैनेजर के साथ स्थापितcloc कर सकते हैं - उदाहरण के लिए, होमब्रे केbrew install cloc साथ ।

cloc $(git ls-files)अक्सर सुधार होता है cloc .। उदाहरण के लिए, git ls-filesकोड की 471 लाइनों की रिपोर्ट के साथ उपरोक्त नमूना आउटपुट । उसी परियोजना के लिए, cloc .456,279 लाइनों (और चलाने में छह मिनट) की रिपोर्ट करता है, क्योंकि यह गिट-इग्नोर किए गए node_modulesफ़ोल्डर में निर्भरता की खोज करता है ।


4
CLOC कुछ भाषाओं को अनदेखा करता है, जैसे टाइपस्क्रिप्ट।
मार्सेलो कैमारगो

6
@MarceloCamargo इस समय टाइपस्क्रिप्ट समर्थित है
अलेक्जेंडर

1
शुरुआत के लिए, लाइनों की गणना करने के लिए "क्लॉक DIRECTORY_WHERE_YOUR_GIT_IN" निष्पादित करने के लिए बेहतर है।
शि

पूरा विवरण यहां है: github.com/AlDanial/cloc और बायनेरिज़ यहाँ हैं: github.com/AlDanial/cloc/releases/tag/v1.70
पीटर सियोन्टो

15
आप बस cloc --vcs gitइन दिनों का उपयोग कर सकते हैं , जो कुछ नामित मामलों को बुरी तरह से नामित फाइलों (या उनमें से बहुत से) से बचाते हैं।
सीनफ

56

मुझे git ls-files | xargs wc -lबड़ी संख्या में फ़ाइलों के साथ काम करते समय समस्याओं का सामना करना पड़ा है , जहां लाइन की संख्या कई totalलाइनों में काट दी जाएगी ।

प्रश्न से एक टिप लेते हुए कि wc उपयोगिता "कुल" के साथ कई लाइनें क्यों बनाती है? , मैंने इस मुद्दे को दरकिनार करने के लिए निम्न आदेश पाया है:

wc -l $(git ls-files)

या यदि आप केवल कुछ फाइलों की जांच करना चाहते हैं, जैसे कोड:

wc -l $(git ls-files | grep '.*\.cs')


यह बहुत अच्छा है लेकिन यह उन रास्तों के लिए विफल होता है जिनमें सफेद स्थान होते हैं। क्या इसका समाधान करने का कोई तरीका है?
ली हेस

1
जीआरपी के साथ परेशानी थी। *। \ _। एम। बाइनरी फ़ाइलों को उठा रहा है जैसे .mp3, .mp4। कोड फ़ाइलों को सूचीबद्ध करने के लिए wc -l $(git ls-files | find *.m *.h)
फ़ाइंड

3
@LeaHayes यह एक तरीका है: wc -l --files0-from=<(git ls-files -z)<(COMMAND)वाक्य रचना एक फ़ाइल जिनकी सामग्री का परिणाम है के नाम देता है COMMAND
हिरन

@buck धन्यवाद, लेकिन मुझे एक त्रुटि मिल रही है जब मैं कोशिश करता हूं कि कमांड 'प्रक्रिया प्रतिस्थापन के लिए पाइप नहीं बना सकती है: फ़ंक्शन लागू नहीं किया गया wc: अपरिचित विकल्प --files0-from ='। कोई विचार?
ली हेस

1
@LeaHayes मैं इस स्क्रिप्ट के साथ आया था जो मुझे लगता है कि आपके लिए काम करेगा: `` `#! / बिन / bash परिणाम = $ (git ls-files | xargs -d '\ n' wc -l) grand_total = 0 के लिए एक्स में $ (प्रतिध्वनि "$ परिणाम" | egrep '[[: अंक:]] + कुल $'); दे सकता हूँ grand_total + = $ (गूंज "$ एक्स" | awk '{$ 1 प्रिंट}') किया गूंज "$ {परिणाम}" गूंज "महायोग: $ {grand_total}" `` `
हिरन

45

वैसे भी मेरे लिए सबसे अच्छा समाधान, @ ephemient के उत्तर की टिप्पणियों में दफन है। मैं बस इसे यहाँ खींच रहा हूँ ताकि यह किसी का ध्यान न जाए। इसके लिए श्रेय @FRoZeN (और @ephemient) को जाना चाहिए।

git diff --shortstat `git hash-object -t tree /dev/null`

रेपो के वर्किंग डायरेक्टरी में कुल फ़ाइलों और लाइनों को बिना किसी अतिरिक्त शोर के लौटाता है। एक बोनस के रूप में, केवल स्रोत कोड गिना जाता है - बाइनरी फ़ाइलों को टैली से बाहर रखा गया है।

ऊपर का कमांड लिनक्स और ओएस एक्स पर काम करता है। इसका क्रॉस-प्लेटफॉर्म संस्करण है

git diff --shortstat 4b825dc642cb6eb9a060e54bf8d69288fbee4904

यह विंडोज पर भी काम करता है।

रिकॉर्ड के लिए, रिक्त लाइनों को छोड़कर विकल्प,

  • -w/ --ignore-all-space,
  • -b/ --ignore-space-change,
  • --ignore-blank-lines,
  • --ignore-space-at-eol

जब उपयोग के साथ कोई प्रभाव नहीं है --shortstat। खाली लाइनों को गिना जाता है।


1
git mktree </dev/nullया true|git mktreeया git mktree <&-या :|git mktreeहमारे बीच कीस्ट्रोक-काउंटर :-) के लिए - एक अतिरिक्त खाली पेड़ रेपो के आसपास चल चोट कुछ भी नहीं जा रहा है।
jthill

2
लोगों के लिए यह सोचकर कि क्या हैश नीले रंग से बाहर है: stackoverflow.com/questions/9765453/…
तेजस काले

19

यह क्लोक 1.68 के रूप में काम करता है :

cloc --vcs=git


--vcsमेरे लिए काम नहीं किया, शायद इसे हटा दिया गया था। cloc .जबकि git रेपो ने काम किया, OTOH।
acdcjunior

13

मैं cmder ( http://gooseberrycreative.com/cmder/ ) के साथ खेल रहा था और मैं html, css, जावा और जावास्क्रिप्ट की पंक्तियों को गिनना चाहता था। जबकि ऊपर दिए गए कुछ उत्तरों ने काम किया, orgrep में पैटर्न नहीं था - मैंने यहां पाया ( /unix/37313/how-do-i-grep-for-multiple-patterns ) - मेरे पास था इससे बचने के लिए

तो यह वही है जो अब मैं उपयोग करता हूं:

git ls-files | grep "\(.html\|.css\|.js\|.java\)$" | xargs wc -l


2
यह मेरे लिए विखंडू के साथ प्रतिक्रिया करने के लिए लग रहा था। जस्टिन एक्वाड्रो के समाधान के साथ संयोजन में अपने grep का उपयोग करना मेरे लिए अच्छी तरह से हुआ। wc -l $ (git ls-files | grep "\ _ (। html \ | .css @ | .js \ _ .php \ | .json \ |। ssh)) $"
पीटर मार्क

9

मैं निम्नलिखित का उपयोग करता हूं:

git grep ^ | wc -l

यह रेगेक्स के लिए गिट द्वारा संस्करणित सभी फाइलों को खोजता है ^, जो एक लाइन की शुरुआत का प्रतिनिधित्व करता है, इसलिए यह कमांड कुल पंक्तियों की संख्या देता है!


3

इसे मैने किया है:

git ls-files | xargs file | grep "ASCII" | cut -d : -f 1 | xargs wc -l

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


3

यह टूल github https://github.com/flosse/sloc पर आउटपुट को अधिक वर्णनात्मक तरीके से दे सकता है। यह आपके स्रोत कोड के आँकड़े बनाएगा:

  • भौतिक रेखाएँ
  • कोड की लाइनें (स्रोत)
  • टिप्पणियों के साथ लाइनें
  • एकल-पंक्ति टिप्पणियाँ
  • ब्लॉक टिप्पणियों के साथ लाइनें
  • स्रोत और टिप्पणियों के साथ मिश्रित लाइनें
  • खाली लाइनें

1

प्रयत्न:

find . -type f -name '*.*' -exec wc -l {} + 

निर्देशिका में / निर्देशिका में सवाल


0
: | git mktree | git diff --shortstat --stdin

या:

git ls-tree @ | sed '1i\\' | git mktree --batch | xargs | git diff-tree --shortstat --stdin

0

आप बाइनरी फ़ाइलों को शामिल करना चाहते हैं या नहीं, इसके आधार पर, दो समाधान हैं।

  1. git grep --cached -al '' | xargs -P 4 cat | wc -l
  2. git grep --cached -Il '' | xargs -P 4 cat | wc -l

    "xargs -P 4" का अर्थ है कि यह चार समानांतर प्रक्रियाओं का उपयोग करके फ़ाइलों को पढ़ सकता है। यह वास्तव में मददगार हो सकता है यदि आप बहुत बड़ी रिपोजिटरी को स्कैन कर रहे हैं। मशीन की क्षमता के आधार पर आप प्रक्रियाओं की संख्या बढ़ा सकते हैं।

    -A, बाइनरी फाइलों को टेक्स्ट के रूप में प्रोसेस करें (बाइनरी शामिल करें)
    -l '', मिलान लाइनों के बजाय केवल फ़ाइल नाम दिखाएँ (केवल गैर खाली फाइलें स्कैन करें)
    -I, बाइनरी फ़ाइलों (
    एक्सक्लूड बाइनरी) में पैटर्न से मेल न खाएं - संलग्न, कार्य ट्री के बजाय अनुक्रमणिका में खोज करें (शामिल नहीं की गई फ़ाइलें)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.