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.