Policz liczbę linii w repozytorium git

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

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

Szukam komendy do cat wszystkich tych plików. Coś jak

git ls-files | [cat all these files] | wc -l
Author: Artem Solovev, 2011-01-27

16 answers

xargs zrobi co chcesz:

git ls-files | xargs cat | wc -l

Ale z większą ilością informacji i chyba lepiej, można zrobić:

git ls-files | xargs wc -l
 1238
Author: Carl Norum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-27 22:11:03
git diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904

Pokazuje różnice pomiędzy pustym drzewem a bieżącym drzewem roboczym. Co zdarza się liczyć wszystkie linie w bieżącym drzewie roboczym.

Aby uzyskać liczby w bieżącym drzewie roboczym, wykonaj następujące czynności:

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

Da ci ciąg podobny do 1770 files changed, 166776 insertions(+).

 373
Author: ephemient,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-21 09:34:24

Jeśli chcesz tę liczbę, ponieważ chcesz poznać zakres projektu, możesz preferować wyjście CLOC ("licz linie kodu"), które daje podział znaczących i nieistotnych linii kodu według języka.

cloc $(git ls-files)

(ten wiersz jest odpowiednikiem git ls-files | xargs cloc. Używa sh ' s $() funkcja zastępowania poleceń.)

Przykładowe wyjście:

      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. Możesz prawdopodobnie zainstalować cloc za pomocą menedżer pakietów – na przykład brew install cloc z Homebrew.

cloc $(git ls-files) jest często ulepszeniem w stosunku do cloc .. Na przykład powyższe Przykładowe wyjście z git ls-files zgłasza 471 linii kodu. Dla tego samego projektu cloc . zgłasza aż 456 279 linii (i trwa 6 minut), ponieważ przeszukuje zależności w folderze Git-ignored node_modules.

 349
Author: Rory O'Kane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-08 17:18:43

Napotkałem problemy z git ls-files | xargs wc -l podczas pracy z dużą liczbą plików, gdzie liczenia linii zostaną podzielone na wiele linii total.

Biorąc podpowiedź z pytania Dlaczego narzędzie wc generuje wiele linii z "total"?, znalazłem następujące polecenie, aby ominąć problem:

wc -l $(git ls-files)

Lub jeśli chcesz przejrzeć tylko niektóre pliki, np. kod:

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

 61
Author: Justin Aquadro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:33:25

Najlepsze rozwiązanie, jak dla mnie, jest zakopane w komentarzach odpowiedzi @ephemient. Wyciągam go tutaj, żeby nie pozostał niezauważony. Zasługa za to powinna iść do @FRoZeN (i @ephemient).

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

Zwraca sumę plików i linii w katalogu roboczym repo, bez żadnych dodatkowych szumów. Jako bonus, liczony jest tylko kod źródłowy - pliki binarne są wykluczone z listy.

Powyższe polecenie działa na Linuksie i OS X. wieloplatformowe wersja to

git diff --shortstat 4b825dc642cb6eb9a060e54bf8d69288fbee4904

To działa również na Windows.

Dla przypomnienia, opcje wyłączenia pustych linii,

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

Nie mają żadnego wpływu podczas stosowania z --shortstat. Puste linie są liczone.

 48
Author: hashchange,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-04 15:39:44

To działa od cloc 1.68:

cloc --vcs=git

 19
Author: kes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-16 23:11:37

Używam:

git grep ^ | wc -l

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

 14
Author: Christopher Shroba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-11 06:46:38

I was playing around with cmder ( http://gooseberrycreative.com/cmder / ) i chciałem policzyć linie html, css,java i javascript. Chociaż niektóre z powyższych odpowiedzi zadziałały, or wzór w grepie nie-znalazłem tutaj ( https://unix.stackexchange.com/questions/37313/how-do-i-grep-for-multiple-patterns ), że musiałem od tego uciec

Więc to jest to, czego używam teraz:

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

 13
Author: Michail Michailidis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-13 12:36:24

Zrobiłem to:

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

To działa, jeśli policzysz wszystkie pliki tekstowe w repozytorium jako interesujące pliki. Jeśli niektóre są uważane za dokumentację, itp., można dodać filtr wykluczeń.

 3
Author: Sasha Pachev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-21 21:39:51

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

  • linie fizyczne
  • wiersze kodu (źródło)
  • wiersze z komentarzami
  • komentarze jednolinijkowe
  • wiersze z komentarzami blokowymi
  • wiersze pomieszane ze źródłami i komentarzami
  • puste linie
 3
Author: love,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-04 08:00:17

Jeśli chcesz znaleźć całkowitą liczbę niepustych linii, możesz użyć AWK:

git ls-files | xargs cat | awk '/\S/{x++} END{print "Total number of non-empty lines:", x}'

Używa regex do liczenia linii zawierających Nie-biały znak.

 2
Author: Daniel Giger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-04 20:24:44
: | git mktree | git diff --shortstat --stdin

Lub:

git ls-tree @ | sed '1i\\' | git mktree --batch | xargs | git diff-tree --shortstat --stdin
 1
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-10 01:02:36

Try:

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

Na danym katalogu / katalogach

 1
Author: Theos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-15 13:16:31

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 odczytywać pliki za pomocą 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żna zwiększyć liczbę procesów.

    -a, przetwarza pliki binarne jako tekst (Include Binary)
    -l ", pokazuje tylko nazwy plików zamiast pasujące linie (Skanuj tylko niepuste pliki)
    -I, don ' t match patterns in binary files (Exclude Binary)
    --buforowane, szukaj w indeksie zamiast w drzewie roboczym (Include uncommitted files)

 1
Author: bharath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-04 18:22:03

Jeśli chcesz uzyskać liczbę wierszy od określonego autora, spróbuj użyć następującego kodu:

git ls-files "*.java" | xargs -I{} git blame {} | grep ${your_name} | wc -l
 1
Author: Wang Zhong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-11 03:28:53

Odpowiedź Carla Noruma zakłada, że nie ma plików ze spacjami, jeden ze znaków IFS, a pozostałe to tab i newline. Rozwiązaniem byłoby zakończenie linii bajtem NULL.

 git ls-files -z | xargs -0 cat | wc -l
 1
Author: Raffi Mohammed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-11-19 07:23:08