Подсчитать количество строк в репозитории git

Как бы подсчитать общее количество строк, присутствующих во всех файлах в репозитории git?

git ls-files дает мне список файлов, отслеживаемых git.

Я ищу команду cat все эти файлы. Что-то вроде

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

18 ответов

Решение

xargs буду делать что хочешь

git ls-files | xargs cat | wc -l

Но с большей информацией и, возможно, лучше, вы можете сделать:

git ls-files | xargs wc -l

Если вам нужен этот счет, потому что вы хотите получить представление о масштабах проекта, вы можете предпочесть вывод CLOC ("Количество строк кода"), который дает вам разбивку значимых и незначимых строк кода по языку.

cloc $(git ls-files)

(Эта строка эквивалентна git ls-files | xargs cloc, Оно использует sh "s $() функция подстановки команд.)

Образец вывода:

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

Сначала вам нужно будет установить CLOC. Вы можете, вероятно, установить cloc с вашим менеджером пакетов - например, brew install cloc с доморощенным.

cloc $(git ls-files) часто улучшение по сравнению с cloc ., Например, приведенный выше пример вывода с git ls-files сообщает 471 строк кода. Для того же проекта, cloc . сообщает о колоссальных 456 279 строк (и занимает шесть минут), потому что он ищет зависимости в Git-игнорируемых node_modules папка.

git diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904

Это показывает различия от пустого дерева к вашему текущему рабочему дереву. Что происходит для подсчета всех строк в вашем текущем рабочем дереве.

Чтобы получить числа в вашем текущем рабочем дереве, сделайте это:

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

Это даст вам строку, как 1770 files changed, 166776 insertions(+),

В любом случае, лучшее решение для меня - в комментариях к ответу @ephemient. Я просто вытаскиваю это сюда, чтобы оно не осталось незамеченным. Кредит на это должен идти в @FRoZeN (и @ephemient).

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

возвращает общее количество файлов и строк в рабочем каталоге репо без каких-либо дополнительных помех. В качестве бонуса учитывается только исходный код - двоичные файлы исключаются из подсчета.

Команда выше работает на Linux и OS X. Кроссплатформенная версия этого

git diff --shortstat 4b825dc642cb6eb9a060e54bf8d69288fbee4904

Это работает и в Windows.

Для записи, варианты для исключения пустых строк,

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

не имеет никакого эффекта при использовании с --shortstat, Пустые строки подсчитываются.

Я столкнулся с проблемами дозирования git ls-files | xargs wc -l при работе с большим количеством файлов, где количество строк будет разбито на несколько total линий.

Отвечая на вопрос, почему утилита wc генерирует несколько строк с "total"? Я нашел следующую команду, чтобы обойти проблему:

wc -l $(git ls-files)

Или, если вы хотите проверить только некоторые файлы, например, код:

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

Это работает с часов 1.68:

cloc --vcs=git

Я использую следующее:

git grep ^ | wc -l

Это ищет все файлы, проверенные git для регулярного выражения ^, который представляет начало строки, поэтому эта команда дает общее количество строк!

Я играл с cmder ( http://gooseberrycreative.com/cmder/) и хотел посчитать строки html,css,java и javascript. Хотя некоторые из приведенных выше ответов сработали, or шаблон в grep не сделал - я обнаружил здесь ( https://unix.stackexchange.com/questions/37313/how-do-i-grep-for-multiple-patterns), что мне пришлось его избежать

Вот что я сейчас использую:

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

Если вы хотите получить количество строк от определенного автора, попробуйте следующий код:

git ls-files "*.java" | xargs -I{} git blame {} | grep ${your_name} | wc -l

Я сделал это:

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

это работает, если вы считаете все текстовые файлы в хранилище интересующими вас файлами. Если некоторые из них считаются документацией и т. Д., Фильтр исключения может быть добавлен.

Пытаться:

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

на каталог / рассматриваемые каталоги

Этот инструмент на github https://github.com/flosse/sloc может дать вывод более наглядным способом. Это создаст статистику вашего исходного кода:

  • физические линии
  • строки кода (источник)
  • строки с комментариями
  • однострочные комментарии
  • строки с блочными комментариями
  • строки перепутаны с источником и комментариями
  • пустые строки

Если вы хотите найти общее количество непустых строк, вы можете использовать AWK:

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

Это использует регулярное выражение для подсчета строк, содержащих непробельный символ.

В зависимости от того, хотите ли вы включать двоичные файлы, есть два решения.

  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" означает, что он может читать файлы с помощью четырех параллельных процессов. Это может быть действительно полезно, если вы сканируете очень большие репозитории. В зависимости от мощности машины вы можете увеличить количество процессов.

    -a, обрабатывать двоичные файлы как текст (включить двоичный)
    -l '', показывать только имена файлов вместо совпадающих строк (сканировать только непустые файлы)
    -I, не сопоставлять шаблоны в двоичных файлах (исключить двоичные файлы)
    --cached, поиск в индексе, а не в дереве работ (включая незафиксированные файлы)

Ответ Карла Норума предполагает, что файлов с пробелами нет, один из символов IFS с остальными tab и newline. Решением было бы завершить строку байтом NULL.

 git ls-files -z | xargs -0 cat | wc -l
: | git mktree | git diff --shortstat --stdin

Или же:

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

Из терминала Windows11 :

      wsl.exe /bin/bash -c "git ls-files .| xargs wc -mwl"

Где . это ваш репозиторий git

Выход:

Количество линий | Количество слов | Количество символов

Следующий фрагмент из

mandiwise / Подсчет строк в репозитории Git

у меня работает в Windows 10 в Git Bash

      git ls-files | xargs wc -l

данная команда выведет список файлов со счетчиком sloc для каждого файла и общим количеством sloc для репо.

Другие вопросы по тегам