Contare il numero di linee in un repository git

Come dovrei contare il numero totale di linee presenti in tutti i file in un repository git?

git ls-files mi dà una lista di file tracciati da git.

Sto cercando un comando per mettere tutti i file in fila. Qualcosa di simile a

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

xargs farà quello che vuoi:

 git ls-files | xargs cat | wc -l 

Ma con più informazioni e probabilmente meglio, puoi fare:

 git ls-files | xargs wc -l 
 git diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 

Questo mostra le differenze dall’albero vuoto al tuo albero di lavoro corrente. Che succede a contare tutte le linee nell’albero di lavoro corrente.

Per ottenere i numeri nel tuo albero di lavoro corrente, fai questo:

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

Ti darà una stringa come 1770 files changed, 166776 insertions(+) .

Se si desidera questo conteggio perché si vuole avere un’idea dell’ambito del progetto, si può preferire l’output di CLOC (“Count Lines of Code”), che fornisce una suddivisione di righe significative e insignificanti di codice per lingua.

 cloc $(git ls-files) 

(Questa riga equivale a git ls-files | xargs cloc . Usa la funzione di sostituzione di comando sh $() ).

Uscita di esempio:

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

Dovrai prima installare CLOC. Probabilmente è ansible installare cloc con il proprio gestore di pacchetti, ad esempio brew install cloc con Homebrew .

cloc $(git ls-files) è spesso un miglioramento rispetto al cloc . . Ad esempio, l’output di esempio sopra con git ls-files riporta 471 righe di codice. Per lo stesso progetto, cloc . riporta 456.279 linee (e impiegano sei minuti per essere eseguito), perché cerca le dipendenze nella cartella node_modules Git-ignored.

Ho riscontrato problemi di batch con git ls-files | xargs wc -l git ls-files | xargs wc -l quando si ha a che fare con un numero elevato di file, in cui i conteggi delle linee verranno suddivisi in più righe total .

Dare un consiglio alla domanda Perché l’utilità wc genera più righe con “totale”? , Ho trovato il seguente comando per aggirare il problema:

wc -l $(git ls-files)

O se vuoi esaminare solo alcuni file, ad esempio il codice:

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

La soluzione migliore, per me, comunque, è sepolta nei commenti della risposta di @ ephemient. Sto solo tirandolo su in modo che non passi inosservato. Il merito di questo dovrebbe andare a @FRoZeN (e @ephemient).

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

restituisce il totale di file e righe nella directory di lavoro di un repository, senza alcun rumore aggiuntivo. Come bonus, viene conteggiato solo il codice sorgente – i file binari sono esclusi dal conteggio.

Il comando precedente funziona su Linux e OS X. La versione multipiattaforma di esso è

 git diff --shortstat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 

Funziona anche su Windows.

Per la cronaca, le opzioni per escludere le righe vuote,

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

non ha alcun effetto se usato con --shortstat . Le righe vuote vengono contate.

Stavo giocando con cmder ( http://gooseberrycreative.com/cmder/ ) e volevo contare le linee di html, css, java e javascript. Mentre alcune delle risposte sopra hanno funzionato, or schema di grep non lo ha fatto – ho trovato qui ( https://unix.stackexchange.com/questions/37313/how-do-i-grep-for-multiple-patterns ) che io dovuto scappare

Quindi questo è quello che uso ora:

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

Io uso il seguente:

 git grep ^ | wc -l 

Cerca tutti i file controllati da git per regex ^ , che rappresenta l’inizio di una riga, quindi questo comando indica il numero totale di righe!

Funziona a partire dal cloc 1.68:

cloc --vcs=git

Questo strumento su github https://github.com/flosse/sloc può dare l’output in modo più descrittivo. Creerà le statistiche del tuo codice sorgente:

  • linee fisiche
  • linee di codice (fonte)
  • linee con commenti
  • commenti a riga singola
  • linee con commenti di blocco
  • linee confuse con sorgenti e commenti
  • linee vuote

L’ho fatto:

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

questo funziona se si contano tutti i file di testo nel repository come file di interesse. Se alcuni sono considerati documentazione, ecc, è ansible aggiungere un filtro di esclusione.

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

O:

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

Provare:

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

nella directory / directory in questione