Policz liczbę wierszy w repozytorium git

766

Jak policzyć całkowitą liczbę wierszy obecnych we wszystkich plikach w repozytorium git?

git ls-files daje mi listę plików śledzonych przez git.

Szukam polecenia do catwszystkich tych plików. Coś jak

git ls-files | [cat all these files] | wc -l
Dogbert
źródło

Odpowiedzi:

1139

xargs zrobi co chcesz:

git ls-files | xargs cat | wc -l

Ale mając więcej informacji i prawdopodobnie lepiej, możesz:

git ls-files | xargs wc -l
Carl Norum
źródło
11
Chyba trywialne; Co powiesz na dołączanie tylko plików kodu źródłowego (np. * .Cpp). Zgłoszono kilka plików bin :)
Daniel
39
W takim razie zostań grep cpp |tam xargs.
Carl Norum
35
Użyj, git ls-files -z | xargs -0 wc -ljeśli masz pliki ze spacjami w nazwie.
mpontillo,
34
Do dołączania / wykluczania niektórych plików użyj: git ls-files | grep -P ".*(hpp|cpp)" | xargs wc -lgdzie część grep jest dowolnym wyrażeniem regularnym w Perlu!
Gabriel
29
Jeśli interesują Cię tylko pliki .java, których możesz użyćgit ls-files | grep "\.java$" | xargs wc -l
dseibert
352
git diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904

Pokazuje różnice między pustym drzewem a bieżącym drzewem roboczym. Co się dzieje, aby policzyć wszystkie wiersze w bieżącym drzewie roboczym.

Aby uzyskać liczby z bieżącego drzewa roboczego, wykonaj następujące czynności:

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

To da ci ciąg jak 1770 files changed, 166776 insertions(+).

efemeryczny
źródło
45
BTW, możesz uzyskać ten skrót, uruchamiając git hash-object -t tree /dev/null.
ephemient
84
I jeszcze bardziej zwięzłe:git diff --stat `git hash-object -t tree /dev/null`
rpetrich
10
Jest to lepsze rozwiązanie, ponieważ nie uwzględnia plików binarnych, takich jak archiwa lub obrazy, które są liczone w powyższej wersji!
BrainStone
31
+1 Podoba mi się to rozwiązanie, ponieważ pliki binarne się nie liczą. Jesteśmy też naprawdę zainteresowani ostatnią linią wyjścia git diff:git diff --stat `git hash-object -t tree /dev/null` | tail -1
Gabriele Petronella
31
zamiast tego użyj, git diff --shortstat `git hash-object -t tree /dev/null` aby uzyskać ostatnią linię, ogon nie jest potrzebny.
Jim Wolff
316

Jeśli chcesz tę liczbę, ponieważ chcesz poznać zakres projektu, możesz preferować wyjście CLOC („Count Lines of Code”), który daje podział znaczących i nieistotnych linii kodu według języka.

cloc $(git ls-files)

(Ta linia jest równoważna git ls-files | xargs cloc. Wykorzystuje sh„S $()podstawienie polecenia funkcji).

Przykładowe dane wyjściowe:

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

Najpierw musisz zainstalować CLOC. Prawdopodobnie można zainstalować clocz menadżera pakietów - na przykład brew install clocz Homebrew .

cloc $(git ls-files)jest często lepszym rozwiązaniem cloc .. Na przykład powyższy przykładowy wynik z git ls-filesraportami 471 wierszy kodu. W przypadku tego samego projektu cloc .zgłasza ogromną liczbę 456 279 wierszy (i trwa sześć minut), ponieważ przeszukuje zależności w node_modulesfolderze ignorowanym przez Git .

Rory O'Kane
źródło
4
CLOC ignoruje niektóre języki, takie jak TypeScript.
Marcelo Camargo,
6
@MarceloCamargo w tej chwili obsługiwany jest TypeScript
Alexander
1
Dla początkujących lepiej wykonać „cloc DIRECTORY_WHERE_YOUR_GIT_IN”, aby obliczyć linie.
Shi
Pełny opis znajduje się tutaj: github.com/AlDanial/cloc, a pliki binarne są tutaj: github.com/AlDanial/cloc/releases/tag/v1.70
Peter Szanto
15
Możesz po prostu korzystać z cloc --vcs gittych dni, co pozwala uniknąć niektórych przypadków krawędzi ze źle nazwanymi plikami (lub zbyt dużą ich liczbą).
seanf
56

Wystąpiły problemy wsadowe git ls-files | xargs wc -lpodczas pracy z dużą liczbą plików, gdzie liczba linii zostanie podzielona na wiele totallinii.

Biorąc wskazówkę z pytania Dlaczego narzędzie wc generuje wiele wierszy z „total”? , Znalazłem następujące polecenie w celu obejścia problemu:

wc -l $(git ls-files)

Lub jeśli chcesz sprawdzić tylko niektóre pliki, np. Kod:

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

Justin Aquadro
źródło
To świetnie, ale wydaje się, że zawodzi w przypadku ścieżek zawierających białe spacje. Czy istnieje sposób na rozwiązanie tego problemu?
Lea Hayes
1
Wystąpił problem z grep '. * \. M' pobieraniem plików binarnych takich jak .mp3, .mp4. Więcej sukcesów przy użyciu polecenia find do listy plików koduwc -l $(git ls-files | find *.m *.h)
Tico Ballagas,
3
@LeaHayes to jest jeden sposób: wc -l --files0-from=<(git ls-files -z). <(COMMAND)Składnia zwraca nazwę pliku, którego zawartość jest wynikiem COMMAND.
buck
@buck Dzięki, ale pojawia się błąd, gdy próbuję tego polecenia „nie można utworzyć potoku dla podstawienia procesu: Funkcja nie jest zaimplementowana wc: nierozpoznana opcja --files0-from =”. Jakieś pomysły?
Lea Hayes,
1
@LeaHayes Wymyśliłem ten skrypt, który moim zdaniem będzie dla ciebie odpowiedni: `` #! / Bin / bash results = $ (git ls-files | xargs -d '\ n' wc -l) pozwól grand_total = 0 dla x w $ (echo „$ results” | egrep '[[: digit:]] + total $'); pozwól, by grand_total + = $ (echo "$ x" | awk '{print $ 1}') wykonał echo "$ {wyniki}" echo "grand total: $ {grand_total}" ``
buck
45

Dla mnie najlepsze rozwiązanie jest ukryte w komentarzach odpowiedzi @ ephemient. Po prostu wyciągam to tutaj, żeby nie pozostało niezauważone. Uznanie za to powinno pochodzić z @FRoZeN (i @ephemient).

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

zwraca całkowitą liczbę plików i wierszy w katalogu roboczym repozytorium, bez dodatkowego hałasu. Jako bonus liczony jest tylko kod źródłowy - pliki binarne są wykluczane z licznika.

Powyższe polecenie działa w systemach Linux i OS X. Jest to wersja wieloplatformowa

git diff --shortstat 4b825dc642cb6eb9a060e54bf8d69288fbee4904

Działa to również w systemie Windows.

Dla przypomnienia, opcje wykluczania pustych linii,

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

nie działają, gdy są używane z --shortstat. Zliczane są puste linie.

hashchange
źródło
1
git mktree </dev/nulllub true|git mktreelub git mktree <&-lub :|git mktreeza jego naciśnięcie-liczniki wśród nas :-) - zapasowy pustym drzewie pływających wokół repo nie będzie bolało niczym.
jthill
2
Dla osób zastanawiających się, co to
Tejas Kale
19

Działa to od cloc 1.68:

cloc --vcs=git

Kes
źródło
--vcsnie działało dla mnie, może zostało usunięte. cloc .podczas gdy w repozytorium git działało, OTOH.
acdcjunior
13

Bawiłem się z cmder ( http://gooseberrycreative.com/cmder/ ) i chciałem policzyć wiersze html, css, java i javascript. Chociaż niektóre z powyższych odpowiedzi działały, orwzór w grep nie zadziałał - znalazłem tutaj ( /unix/37313/how-do-i-grep-for-multiple-patterns ), który miałem uciec od tego

Więc tego teraz używam:

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

Michail Michailidis
źródło
2
Wydawało mi się, że to odpowiada mi kawałkami. Używanie twojego grepa w połączeniu z rozwiązaniem Justina Aquadro przyniosło mi dobre wyniki. wc -l $ (git ls-files | grep "\ (. html \ | .css \ | .js \ | .php \ | .json \ | .sh \) $")
Peter Mark
9

Używam następujących:

git grep ^ | wc -l

Przeszukuje wszystkie pliki wersjonowane przez git w poszukiwaniu wyrażenia regularnego ^, który reprezentuje początek linii, więc to polecenie podaje całkowitą liczbę linii!

Christopher Shroba
źródło
3

Ja to zrobiłem:

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

działa to, jeśli policzysz wszystkie pliki tekstowe w repozytorium jako pliki zainteresowania. Jeśli niektóre są uważane za dokumentację itp., Można dodać filtr wykluczający.

Sasha Pachev
źródło
3

To narzędzie na github https://github.com/flosse/sloc może dać wynik w bardziej opisowy sposób. Stworzy statystyki twojego kodu źródłowego:

  • linie fizyczne
  • wiersze kodu (źródło)
  • linie z komentarzami
  • komentarze jednowierszowe
  • wiersze z komentarzami blokowymi
  • linie pomieszane ze źródłem i komentarzami
  • puste linie
miłość
źródło
1

Próbować:

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

w danym katalogu / katalogach

Theos
źródło
0
: | git mktree | git diff --shortstat --stdin

Lub:

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

źródło
0

W zależności od tego, czy chcesz dołączyć pliki binarne, istnieją dwa rozwiązania.

  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” oznacza, że ​​może czytać pliki przy użyciu czterech równoległych procesów. Może to być bardzo pomocne, jeśli skanujesz bardzo duże repozytoria. W zależności od wydajności maszyny możesz zwiększyć liczbę procesów.

    -a, przetwarzaj pliki binarne jako tekst (Uwzględnij plik binarny)
    -l '', pokaż tylko nazwy plików zamiast pasujących linii (Skanuj tylko niepuste pliki)
    -I, Nie dopasowuj wzorców w plikach binarnych (Wyklucz Binarny) -
    buforowane, szukaj w indeksie zamiast w drzewie roboczym (Uwzględnij nieproszone pliki)

bharath
źródło