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

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

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(+).


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 .


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


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.


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


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


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!


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.


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

1

Próbować:

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

w danym katalogu / katalogach


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

Lub:

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

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)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.