Zählen Sie die Anzahl der Zeilen in einem Git-Repository

766

Wie würde ich die Gesamtzahl der Zeilen zählen, die in allen Dateien in einem Git-Repository vorhanden sind?

git ls-files gibt mir eine Liste von Dateien, die von git verfolgt werden.

Ich suche nach einem Befehl für catall diese Dateien. Etwas wie

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

Antworten:

1139

xargs wird tun was du willst:

git ls-files | xargs cat | wc -l

Aber mit mehr Informationen und wahrscheinlich besser können Sie Folgendes tun:

git ls-files | xargs wc -l
Carl Norum
quelle
11
Ich denke trivial; Wie wäre es, wenn Sie nur Quellcodedateien (z. B. * .cpp) einschließen. Wir haben einige Bin-Dateien festgeschrieben :)
Daniel
39
Bleib grep cpp |dort vor dem xargs, dann.
Carl Norum
35
Verwenden git ls-files -z | xargs -0 wc -lSie diese Option, wenn Sie Dateien mit Leerzeichen im Namen haben.
mpontillo
34
Zum Einschließen / Ausschließen bestimmter Dateien verwenden Sie: git ls-files | grep -P ".*(hpp|cpp)" | xargs wc -lwobei der grep-Teil ein beliebiger Perl-Regex ist, den Sie möchten!
Gabriel
29
Wenn Sie nur an .java-Dateien interessiert waren, können Sie diese verwendengit ls-files | grep "\.java$" | xargs wc -l
dseibert
352
git diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904

Dies zeigt die Unterschiede zwischen dem leeren Baum und Ihrem aktuellen Arbeitsbaum. Was passiert, um alle Zeilen in Ihrem aktuellen Arbeitsbaum zu zählen.

Gehen Sie folgendermaßen vor, um die Zahlen in Ihrem aktuellen Arbeitsbaum abzurufen:

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

Es wird Ihnen eine Zeichenfolge wie geben 1770 files changed, 166776 insertions(+).

kurzlebig
quelle
45
Übrigens können Sie diesen Hash durch Ausführen erhalten git hash-object -t tree /dev/null.
Ephemient
84
Und noch prägnanter:git diff --stat `git hash-object -t tree /dev/null`
Rpetrich
10
Dies ist die bessere Lösung, da hierbei keine Binärdateien wie Archive oder Bilder gezählt werden, die in der obigen Version gezählt werden!
BrainStone
31
+1 Diese Lösung gefällt mir besser, da Binärdateien nicht gezählt werden. Auch wir sind wirklich nur an der letzten Zeile der Git Diff Ausgabe interessiert:git diff --stat `git hash-object -t tree /dev/null` | tail -1
Gabriele Petronella
31
Verwenden Sie stattdessen git diff --shortstat `git hash-object -t tree /dev/null` , um die letzte Zeile zu erhalten. Der Schwanz wird nicht benötigt.
Jim Wolff
316

Wenn Sie diese Anzahl wünschen, weil Sie sich ein Bild vom Umfang des Projekts machen möchten, bevorzugen Sie möglicherweise die Ausgabe von CLOC („Count Lines of Code“), mit der Sie wichtige und unbedeutende Codezeilen nach Sprache aufschlüsseln können.

cloc $(git ls-files)

(Diese Zeile entspricht git ls-files | xargs cloc. Sie verwendet shdie $()Befehlsersetzungsfunktion .)

Beispielausgabe:

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

Sie müssen zuerst CLOC installieren. Sie können wahrscheinlich mit Ihrem Paketmanager installierencloc - zum Beispiel brew install clocmit Homebrew .

cloc $(git ls-files)ist oft eine Verbesserung gegenüber cloc .. In der obigen Beispielausgabe werden beispielsweise git ls-files471 Codezeilen gemeldet. cloc .Meldet für dasselbe Projekt satte 456.279 Zeilen (und die Ausführung dauert sechs Minuten), da die Abhängigkeiten im node_modulesOrdner " Git ignoriert " durchsucht werden .

Rory O'Kane
quelle
4
CLOC ignoriert einige Sprachen wie TypeScript.
Marcelo Camargo
6
@ MarceloCamargo in diesem Moment TypeScript wird unterstützt
Alexander
1
Für Anfänger ist es besser, "cloc DIRECTORY_WHERE_YOUR_GIT_IN" auszuführen, um Linien zu berechnen.
Shi
Die vollständige Beschreibung finden Sie hier: github.com/AlDanial/cloc und die Binärdateien finden Sie hier: github.com/AlDanial/cloc/releases/tag/v1.70
Peter Szanto
15
Sie können cloc --vcs githeutzutage nur verwenden , wodurch einige Randfälle mit schlecht benannten Dateien (oder zu vielen von ihnen) vermieden werden.
Seanf
56

git ls-files | xargs wc -lBeim Umgang mit einer großen Anzahl von Dateien sind Stapelprobleme aufgetreten , bei denen die Zeilenanzahl in mehrere totalZeilen aufgeteilt wird.

Einen Tipp aus der Frage nehmen Warum generiert das Dienstprogramm wc mehrere Zeilen mit "total"? Ich habe den folgenden Befehl gefunden, um das Problem zu umgehen:

wc -l $(git ls-files)

Oder wenn Sie nur einige Dateien untersuchen möchten, z. B. Code:

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

Justin Aquadro
quelle
Das ist großartig, aber es scheint für Pfade, die Leerzeichen enthalten, fehlzuschlagen. Gibt es eine Möglichkeit, das zu lösen?
Lea Hayes
1
Hatte Probleme mit grep '. * \. M' beim Aufnehmen von Binärdateien wie .mp3, .mp4. Hatte mehr Erfolg mit der Verwendung des Befehls find, um wc -l $(git ls-files | find *.m *.h)
Codedateien aufzulisten
3
@LeaHayes das ist eine Möglichkeit : wc -l --files0-from=<(git ls-files -z). Die <(COMMAND)Syntax gibt den Namen einer Datei zurück, deren Inhalt das Ergebnis von ist COMMAND.
Buck
@buck Danke, aber ich erhalte eine Fehlermeldung, wenn ich diesen Befehl versuche 'Pipe für Prozessersetzung kann nicht erstellt werden: Funktion nicht implementiert wc: nicht erkannte Option --files0-from ='. Irgendwelche Ideen?
Lea Hayes
1
@LeaHayes Ich habe mir dieses Skript ausgedacht, von dem ich denke, dass es für Sie funktionieren würde: `` `#! / Bin / bash results = $ (git ls-files | xargs -d '\ n' wc -l) let grand_total = 0 for x in $ (echo "$ results" | egrep '[[: digit:]] + total $'); Lassen Sie grand_total + = $ (echo "$ x" | awk '{print $ 1}') echo "$ {results}" echo "Gesamtsumme: $ {grand_total}" `` `
buck
45

Die beste Lösung ist für mich jedenfalls in den Kommentaren der Antwort von @ ephemient begraben. Ich ziehe es nur hier hoch, damit es nicht unbemerkt bleibt. Das Guthaben hierfür sollte an @FRoZeN (und @ephemient) gehen.

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

Gibt die Gesamtzahl der Dateien und Zeilen im Arbeitsverzeichnis eines Repos ohne zusätzliches Rauschen zurück. Als Bonus wird nur der Quellcode gezählt - Binärdateien werden von der Abrechnung ausgeschlossen.

Der obige Befehl funktioniert unter Linux und OS X. Die plattformübergreifende Version davon ist

git diff --shortstat 4b825dc642cb6eb9a060e54bf8d69288fbee4904

Das funktioniert auch unter Windows.

Für den Datensatz die Optionen zum Ausschließen von Leerzeilen,

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

haben keine Wirkung bei Verwendung mit --shortstat. Leerzeilen werden gezählt.

Hashwechsel
quelle
1
git mktree </dev/nulloder true|git mktreeoder git mktree <&-oder :|git mktreefür die Tastenschalter unter uns :-) - ein leerer Ersatzbaum, der um das Repo schwebt, wird nichts verletzen.
Bis zum
2
Für Leute, die sich fragen, was dieser Hash aus heiterem Himmel ist: stackoverflow.com/questions/9765453/…
Tejas Kale
19

Dies funktioniert ab Cloc 1.68:

cloc --vcs=git

kes
quelle
--vcshat bei mir nicht funktioniert, vielleicht wurde es entfernt. cloc .während im git repo funktionierte, OTOH.
Acdcjunior
13

Ich habe mit cmder ( http://gooseberrycreative.com/cmder/ ) herumgespielt und wollte die Zeilen von HTML, CSS, Java und Javascript zählen. Während einige der obigen Antworten funktionierten, funktionierte das orMuster in grep nicht - ich fand es hier ( /unix/37313/how-do-i-grep-for-multiple-patterns ), das ich hatte um ihm zu entkommen

Das ist es, was ich jetzt benutze:

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

Michail Michailidis
quelle
2
Dies schien für mich mit Brocken zu antworten. Die Verwendung Ihres Greps in Kombination mit der Lösung von Justin Aquadro hat sich für mich als gut erwiesen. wc -l $ (git ls-files | grep "\ (. html \ | .css \ | .js \ | .php \ | .json \ | .sh \) $")
Peter Mark
9

Ich benutze folgendes:

git grep ^ | wc -l

Dadurch werden alle von git versionierten Dateien nach dem regulären Ausdruck durchsucht ^, der den Anfang einer Zeile darstellt. Dieser Befehl gibt also die Gesamtzahl der Zeilen an!

Christopher Shroba
quelle
3

Ich war das:

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

Dies funktioniert, wenn Sie alle Textdateien im Repository als die Dateien von Interesse zählen. Wenn einige als Dokumentation usw. betrachtet werden, kann ein Ausschlussfilter hinzugefügt werden.

Sasha Pachev
quelle
3

Dieses Tool auf github https://github.com/flosse/sloc kann die Ausgabe aussagekräftiger darstellen . Es werden Statistiken Ihres Quellcodes erstellt:

  • physische Linien
  • Codezeilen (Quelle)
  • Zeilen mit Kommentaren
  • einzeilige Kommentare
  • Zeilen mit Blockkommentaren
  • Zeilen mit Quelle und Kommentaren verwechselt
  • leere Zeilen
Liebe
quelle
1

Versuchen:

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

auf das betreffende Verzeichnis / Verzeichnisse

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

Oder:

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

quelle
0

Je nachdem, ob Sie Binärdateien einschließen möchten oder nicht, gibt es zwei Lösungen.

  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" bedeutet, dass die Dateien mit vier parallelen Prozessen gelesen werden können. Dies kann sehr hilfreich sein, wenn Sie sehr große Repositorys scannen. Abhängig von der Kapazität der Maschine können Sie die Anzahl der Prozesse erhöhen.

    -a, Binärdateien als Text verarbeiten (Binär einschließen)
    -l '', nur Dateinamen anstelle übereinstimmender Zeilen anzeigen (Nur nicht leere Dateien scannen )
    -I, Muster in Binärdateien nicht
    abgleichen (Binär ausschließen) --cached, Suche im Index statt im Arbeitsbaum (nicht festgeschriebene Dateien einschließen)

Bharath
quelle