Hitung jumlah baris dalam repositori git


766

Bagaimana cara saya menghitung jumlah total baris yang ada di semua file dalam repositori git?

git ls-files memberi saya daftar file yang dilacak oleh git.

Saya mencari perintah untuk catsemua file itu. Sesuatu seperti

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

Jawaban:


1141

xargs akan melakukan apa yang Anda inginkan:

git ls-files | xargs cat | wc -l

Tetapi dengan lebih banyak informasi dan mungkin lebih baik, Anda dapat melakukan:

git ls-files | xargs wc -l

11
Saya kira sepele; Bagaimana kalau hanya menyertakan file kode sumber (mis. * .Cpp). Kami memiliki beberapa file bin berkomitmen :)
Daniel

39
Tetap grep cpp |di sana sebelum xargs, lalu.
Carl Norum

35
Gunakan git ls-files -z | xargs -0 wc -ljika Anda memiliki file dengan spasi di namanya.
mpontillo

34
Untuk memasukkan / mengecualikan file tertentu gunakan: di git ls-files | grep -P ".*(hpp|cpp)" | xargs wc -lmana bagian grep adalah setiap perl regex yang Anda inginkan!
Gabriel

29
Jika Anda hanya tertarik pada file .java yang dapat Anda gunakangit ls-files | grep "\.java$" | xargs wc -l
dseibert

352
git diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904

Ini menunjukkan perbedaan dari pohon kosong ke pohon Anda saat ini. Yang terjadi menghitung semua baris di pohon kerja Anda saat ini.

Untuk mendapatkan angka di pohon kerja Anda saat ini, lakukan ini:

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

Ini akan memberi Anda string seperti 1770 files changed, 166776 insertions(+).


45
BTW, Anda bisa mendapatkan hash itu dengan menjalankan git hash-object -t tree /dev/null.
ephemient

84
Dan bahkan lebih ringkas:git diff --stat `git hash-object -t tree /dev/null`
rpetrich

10
Ini adalah soloution yang lebih baik karena ini tidak menghitung file biner seperti arsip atau gambar yang dihitung dalam versi di atas!
BrainStone

31
+1 Saya menyukai solusi ini lebih baik karena biner tidak dihitung. Kami juga benar-benar hanya tertarik pada baris terakhir dari keluaran git diff:git diff --stat `git hash-object -t tree /dev/null` | tail -1
Gabriele Petronella

31
alih-alih gunakan git diff --shortstat `git hash-object -t tree /dev/null` untuk mendapatkan baris terakhir, ekor tidak diperlukan.
Jim Wolff

316

Jika Anda ingin penghitungan ini karena Anda ingin mendapatkan gambaran tentang cakupan proyek, Anda dapat memilih output CLOC ("Count Lines of Code"), yang memberi Anda uraian garis-garis kode dengan bahasa yang signifikan dan tidak signifikan.

cloc $(git ls-files)

(Baris ini setara dengan git ls-files | xargs cloc. Ia menggunakan sh's $()substitusi perintah fitur.)

Output sampel:

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

Anda harus menginstal CLOC terlebih dahulu. Anda mungkin dapat menginstal clocdengan manajer paket Anda - misalnya, brew install clocdengan Homebrew .

cloc $(git ls-files)seringkali merupakan perbaikan atas cloc .. Misalnya, contoh output di atas dengan git ls-fileslaporan 471 baris kode. Untuk proyek yang sama, cloc .melaporkan 456.279 baris kekalahan (dan membutuhkan waktu enam menit untuk menjalankan), karena mencari dependensi dalam node_modulesfolder yang diabaikan Git .


4
CLOC mengabaikan beberapa bahasa, seperti TypeScript.
Marcelo Camargo

6
@MarceloCamargo saat ini TypeScript didukung
Alexander

1
Untuk pemula, lebih baik menjalankan "cloc DIRECTORY_WHERE_YOUR_GIT_IN" untuk menghitung baris.
Shi


15
Anda dapat menggunakan cloc --vcs githari-hari ini, yang menghindari beberapa kasus tepi dengan file dengan nama buruk (atau terlalu banyak).
seanf

56

Saya mengalami masalah batching git ls-files | xargs wc -lketika berhadapan dengan sejumlah besar file, di mana jumlah baris akan terpotong menjadi beberapa totalbaris.

Mengambil tip dari pertanyaan. Mengapa utilitas wc menghasilkan beberapa baris dengan "total"? , Saya telah menemukan perintah berikut untuk mem-bypass masalah:

wc -l $(git ls-files)

Atau jika Anda hanya ingin memeriksa beberapa file, misalnya kode:

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


Ini bagus tetapi tampaknya gagal untuk jalur yang berisi ruang putih. Apakah ada cara untuk menyelesaikannya?
Lea Hayes

1
Mengalami masalah dengan grep '. * \. M' mengambil file biner seperti .mp3, .mp4. Lebih sukses menggunakan perintah find untuk membuat daftar kode filewc -l $(git ls-files | find *.m *.h)
Tico Ballagas

3
@LeaHayes ini adalah salah satu cara: wc -l --files0-from=<(git ls-files -z). The <(COMMAND)sintaks mengembalikan nama file yang isinya adalah hasil dari COMMAND.
uang

@ terima kasih, tetapi saya mendapatkan kesalahan ketika saya mencoba perintah itu 'tidak dapat membuat pipa untuk substitusi proses: Fungsi tidak diterapkan wc: opsi tidak dikenal --files0-from ='. Ada ide?
Lea Hayes

1
@LeaHayes Saya datang dengan skrip ini yang saya pikir akan bekerja untuk Anda: `` `#! / Bin / hasil bash = $ (git ls-file | xargs -d '\ n' wc -l) biarkan grand_total = 0 untuk x dalam $ (echo "$ results" | egrep '[[: digit:]] + total $'); jangan biarkan grand_total + = $ (echo "$ x" | awk '{print $ 1}') melakukan echo "$ {results}" echo "total keseluruhan: $ {grand_total}" `` `
buck

45

Solusi terbaik, bagi saya, terkubur dalam komentar jawaban @ ephemient. Saya hanya menariknya di sini sehingga tidak luput dari perhatian. Kredit untuk ini harus masuk ke @FRoZeN (dan @ephemient).

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

mengembalikan total file dan baris dalam direktori kerja repo, tanpa gangguan tambahan. Sebagai bonus, hanya kode sumber yang dihitung - file biner dikecualikan dari penghitungan.

Perintah di atas berfungsi di Linux dan OS X. Versi lintas platformnya adalah

git diff --shortstat 4b825dc642cb6eb9a060e54bf8d69288fbee4904

Itu bekerja pada Windows juga.

Sebagai catatan, opsi untuk mengecualikan garis kosong,

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

tidak memiliki efek apa pun ketika digunakan dengan --shortstat. Garis kosong dihitung.


1
git mktree </dev/nullatau true|git mktreeatau git mktree <&-atau :|git mktreeuntuk penghitung-keystroke di antara kita :-) - pohon kosong yang mengambang di sekitar repo tidak akan melukai apa pun.
jthill

2
Untuk orang-orang yang bertanya-tanya apa itu hash tiba-tiba: stackoverflow.com/questions/9765453/…
Tejas Kale

19

Ini bekerja pada cloc 1.68:

cloc --vcs=git


--vcstidak bekerja untuk saya, mungkin sudah dihapus. cloc .sementara di git repo berhasil, OTOH.
acdcjunior

13

Saya bermain-main dengan cmder ( http://gooseberrycreative.com/cmder/ ) dan saya ingin menghitung garis html, css, java dan javascript. Sementara beberapa jawaban di atas bekerja, orpola grep tidak - saya temukan di sini ( /unix/37313/how-do-i-grep-for-multiple-patterns ) yang saya miliki untuk menghindarinya

Jadi ini yang saya gunakan sekarang:

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


2
Ini sepertinya merespons dengan potongan untuk saya. Menggunakan grep Anda dalam kombinasi dengan solusi Justin Aquadro menghasilkan baik bagi saya. wc-l $ (git ls-files | grep "\ (. html \ | .css \ | .js \ | .php \ | .json \ | .sh \) $")
Peter Mark

9

Saya menggunakan yang berikut ini:

git grep ^ | wc -l

Ini mencari semua file versi git untuk regex ^, yang mewakili awal baris, jadi perintah ini memberikan jumlah total baris!


3

Saya melakukan ini:

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

ini berfungsi jika Anda menghitung semua file teks dalam repositori sebagai file yang menarik. Jika beberapa dianggap dokumentasi, dll, filter pengecualian dapat ditambahkan.


3

Alat ini di github https://github.com/flosse/sloc dapat memberikan output dengan cara yang lebih deskriptif. Ini akan Membuat statistik kode sumber Anda:

  • garis fisik
  • baris kode (sumber)
  • baris dengan komentar
  • komentar satu baris
  • baris dengan blok komentar
  • garis bercampur dengan sumber dan komentar
  • garis kosong

1

Mencoba:

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

pada direktori / direktori yang dimaksud


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

Atau:

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

0

Tergantung pada apakah Anda ingin memasukkan file biner atau tidak, ada dua solusi.

  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" berarti dapat membaca file menggunakan empat proses paralel. Ini bisa sangat membantu jika Anda memindai repositori yang sangat besar. Tergantung pada kapasitas mesin Anda dapat meningkatkan jumlah proses.

    -a, proses file biner sebagai teks (Termasuk Biner)
    -l '', hanya tampilkan nama file alih-alih baris yang cocok (Pindai hanya file yang tidak kosong)
    -Saya, jangan cocokkan pola dalam file biner (Kecualikan Biner)
    --cached, cari di indeks daripada di pohon kerja (Sertakan file yang tidak dikomit)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.