Git deposundaki satır sayısını sayma


766

Git deposundaki tüm dosyalarda bulunan toplam satır sayısını nasıl sayabilirim?

git ls-files bana git tarafından izlenen dosyaların bir listesini verir.

catTüm bu dosyalara bir komut arıyorum . Gibi bir şey

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

Yanıtlar:


1139

xargs ne istersen yapacak:

git ls-files | xargs cat | wc -l

Ancak daha fazla bilgi ve muhtemelen daha iyisi ile şunları yapabilirsiniz:

git ls-files | xargs wc -l

11
Sanırım önemsiz; Yalnızca kaynak kod dosyalarını (ör. * .Cpp) eklemeye ne dersiniz. Bazı bin dosyalarımız var :)
Daniel

39
Sok grep cpp |önce orada xargs, sonra.
Carl Norum

35
Adında git ls-files -z | xargs -0 wc -lboşluk bulunan dosyalarınız varsa kullanın .
mpontillo

34
Belirli dosyaları dahil etmek / hariç tutmak için şunu kullanın: git ls-files | grep -P ".*(hpp|cpp)" | xargs wc -lgrep parçası istediğiniz herhangi bir perl regex!
Gabriel

29
Sadece .java dosyalarıyla ilgileniyorsanızgit ls-files | grep "\.java$" | xargs wc -l
dseibert

352
git diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904

Bu, boş ağaç ile şu anki çalışma ağacınız arasındaki farkları gösterir. Bu, mevcut çalışma ağacınızdaki tüm satırları sayar.

Geçerli çalışma ağacınızdaki sayıları almak için şunu yapın:

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

Size bir dize verecektir 1770 files changed, 166776 insertions(+).


45
BTW, bu hash'ı çalıştırarak alabilirsiniz git hash-object -t tree /dev/null.
ephemient

84
Ve daha da özlü:git diff --stat `git hash-object -t tree /dev/null`
rpetrich

10
Yukarıdaki sürümde sayılan arşivler veya görüntüler gibi ikili dosyaları saymadığından, bu daha iyi bir sollamadır!
BrainStone

31
+1 İkili dosyalar sayılmadığından bu çözümü daha çok seviyorum. Ayrıca biz sadece git fark çıktı son satırıyla ilgileniyoruz:git diff --stat `git hash-object -t tree /dev/null` | tail -1
Gabriele Petronella

31
yerine git diff --shortstat `git hash-object -t tree /dev/null` son satırı almak için kullanın , kuyruk gerekmez.
Jim Wolff

316

Projenin kapsamı hakkında bir fikir edinmek istediğiniz için bu sayımı istiyorsanız , önemli ve önemsiz kod satırlarının dile göre dökümünü veren CLOC (“Kod Satırlarını Say”) çıktısını tercih edebilirsiniz .

cloc $(git ls-files)

(Bu çizgi eşdeğerdir git ls-files | xargs cloc. Bu kullanır shsitesindeki $()komut ikamesi özelliği).

Örnek çıktı:

      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
-------------------------------------------------------------------------------

Önce CLOC kurmanız gerekecek. Muhtemelen olabilir yüklemek clocpaket yöneticinizle - örneğin brew install clocile Homebrew .

cloc $(git ls-files)genellikle üzerinde bir gelişme cloc .. Örneğin, yukarıdaki örnek çıktı git ls-files471 satır kod raporlar. Aynı proje için, cloc .455.279 satırlık bir rapor (ve çalıştırılması altı dakika sürer), çünkü Git yok sayılan node_modulesklasördeki bağımlılıkları arar .


4
CLOC, TypeScript gibi bazı dilleri yok sayar.
Marcelo Camargo

6
@MarceloCamargo şu anda TypeScript desteklenmektedir
Alexander

1
Yeni başlayanlar için, satırları hesaplamak üzere "cloc DIRECTORY_WHERE_YOUR_GIT_IN" i yürütmek daha iyidir.
Shi

Tam açıklama burada: github.com/AlDanial/cloc ve ikili dosyalar burada: github.com/AlDanial/cloc/releases/tag/v1.70
Peter Szanto

15
cloc --vcs gitKötü adlandırılmış dosyalara (veya çok çoğuna) sahip bazı kenar durumlardan kaçınan bu günleri kullanabilirsiniz .
seanf

56

git ls-files | xargs wc -lSatır sayıları birden çok totalsatıra yığınlanacak çok sayıda dosyayla uğraşırken toplu işlem sorunları ile karşılaştım .

Sorudan bahşiş alma wc yardımcı programı neden "total" ile birden fazla satır oluşturur? , Sorunu atlamak için aşağıdaki komutu buldum:

wc -l $(git ls-files)

Veya yalnızca bazı dosyaları, örneğin kodu incelemek istiyorsanız:

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


Bu harika ama beyaz boşluk içeren yollar için başarısız görünüyor. Bunu çözmenin bir yolu var mı?
Lea Hayes

1
Grep ile ilgili sorun yaşadım. * \. M '.mp3, .mp4 gibi ikili dosyaları seçerken. Kod dosyalarını listelemek için find komutunu kullanmada daha başarılı olduwc -l $(git ls-files | find *.m *.h)
Tico Ballagas

3
Bu bir yoludur @LeaHayes: wc -l --files0-from=<(git ls-files -z). <(COMMAND)Sözdizimi içerikleri sonucudur dosyanın adını döndürür COMMAND.
Buck

@buck Teşekkürler, ancak bu komut 'işlem ikamesi için pipo yapamıyor: İşlev uygulanmadı wc: tanınmayan seçenek --files0-from =' komutunu denediğimde bir hata alıyorum. Herhangi bir fikir?
Lea Hayes

1
@LeaHayes Sizin için çalışacağını düşündüğüm bu komut dosyasını buldum: `` #! / Bin / bash sonuçları = $ (git ls-files | xargs -d '\ n' wc -l) izin grand_total = 0 for $ in x (echo "$ results" | egrep '[[: basamak:]] + toplam $'); grand_total + = $ (echo "$ x" | awk '{print $ 1}') yankı "$ {results}" echo "genel toplamını yapsın: $ {grand_total}" ``
dolar

45

Bana göre en iyi çözüm @ ephemient'in cevabının yorumlarına gömüldü. Fark edilmeden gitmesi için buraya çekiyorum. Bunun için kredi @FRoZeN (ve @ephemient) adresine gitmelidir.

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

ek parazit olmadan bir repo'nun çalışma dizinindeki dosya ve satırların toplamını döndürür. Bir bonus olarak, sadece kaynak kodu sayılır - ikili dosyalar hesaptan çıkarılır.

Yukarıdaki komut Linux ve OS X üzerinde çalışır.

git diff --shortstat 4b825dc642cb6eb9a060e54bf8d69288fbee4904

Bu Windows üzerinde de çalışır.

Kayıt için boş satırları hariç tutma seçenekleri,

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

ile kullanıldığında herhangi bir etkisi yoktur --shortstat. Boş satırlar sayılır.


1
git mktree </dev/nullveya true|git mktreeveya git mktree <&-veya :|git mktreearamızdaki tuş vuruş sayaçları için :-) - depo etrafında yüzen boş bir ağaç hiçbir şeye zarar vermez.
jthill

2
Maviden çıkan bu karmanın ne olduğunu merak eden insanlar için: stackoverflow.com/questions/9765453/…
Tejas Kale


13

Cmder ile oynuyordum ( http://gooseberrycreative.com/cmder/ ) ve html, css, java ve javascript satırlarını saymak istedim. Yukarıdaki cevaplardan bazıları işe oryarasa da, grep'teki desen işe yaramadı - burada bulduğumu ( /unix/37313/how-do-i-grep-for-multiple-patterns ) buldum ondan kaçmak için

Şimdi kullandığım şey bu:

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


2
Bu benim için parçalar ile cevap gibiydi. Grep'inizi Justin Aquadro'nun çözümü ile birlikte kullanmak benim için iyi oldu. wc -l $ (git ls-files | grep "\ (. html \ | .css \ | .js \ | .php \ | .json \ | .sh \) $")
Peter Mark

9

Aşağıdakileri kullanıyorum:

git grep ^ | wc -l

Bu, git tarafından sürümlendirilen tüm dosyaları ^bir satırın başlangıcını temsil eden normal ifade için arar , bu nedenle bu komut toplam satır sayısını verir!


3

Bunu ben yaptım:

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

depodaki tüm metin dosyalarını ilgilenilen dosyalar olarak sayarsanız bu çalışır. Bazıları belge vb. Olarak değerlendirilirse, bir hariç tutma filtresi eklenebilir.


3

Https://github.com/flosse/sloc adresindeki bu araç çıktıyı daha açıklayıcı bir şekilde verebilir. Kaynak kodunuzun istatistiklerini oluşturur:

  • fiziksel çizgiler
  • kod satırları (kaynak)
  • yorum içeren satırlar
  • tek satırlık yorumlar
  • blok yorumlu satırlar
  • kaynak ve yorumlarla karışık çizgiler
  • boş çizgiler

1

Deneyin:

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

söz konusu dizinde / dizinlerde


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

Veya:

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

0

İkili dosyaları dahil etmek isteyip istemediğinize bağlı olarak, iki çözüm vardır.

  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" dört paralel işlem kullanarak dosyaları okuyabileceği anlamına gelir. Çok büyük depoları tarıyorsanız bu gerçekten yardımcı olabilir. Makinenin kapasitesine bağlı olarak işlem sayısını artırabilirsiniz.

    -a, ikili dosyaları metin olarak işler (İkili Dahil Et)
    -l '', eşleşen satırlar yerine yalnızca dosya adlarını gösterir (Yalnızca boş olmayan dosyaları tara)
    -I, ikili dosyalardaki desenlerle eşleşmez (İkili Hariç Tut) -
    önbelleğe alınmış, çalışma ağacı yerine dizinde arama (Taranmamış dosyaları dahil et)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.