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

522

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

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

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

git ls-files | [cat all these files] | wc -l
Теги:

11 ответов

779
Лучший ответ

xargs сделает то, что вы хотите:

git ls-files | xargs cat | wc -l

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

git ls-files | xargs wc -l
  • 0
    Это двойной счет, когда у вас есть символические ссылки в вашем хранилище. Может быть, это не проблема, хотя.
  • 11
    Я думаю, тривиально; Как насчет включать только файлы исходного кода (например, * .cpp). У нас есть несколько бин файлов :)
Показать ещё 19 комментариев
250
git diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904

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

  • 42
    Кстати, вы можете получить этот хеш, запустив git hash-object -t tree /dev/null .
  • 77
    И еще более кратко: git diff --stat `git hash-object -t tree /dev/null`
Показать ещё 13 комментариев
219

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

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 с Homebrew.

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

  • 7
    Вау, это полностью взорвало разум. Использовал wc и grep но с тех пор не вернусь к их использованию :)
  • 3
    CLOC игнорирует некоторые языки, такие как TypeScript.
Показать ещё 11 комментариев
38

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

Взяв подсказку из вопроса Почему служебная программа wc генерирует несколько строк с "общим" ?, я нашел следующую команду для обхода проблемы:

wc -l $(git ls-files)

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

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

  • 0
    Это здорово, но, похоже, не работает для путей, которые содержат пробелы. Есть ли способ решить это?
  • 0
    Были проблемы с grep '. * \. M', собирающим двоичные файлы, такие как .mp3, .mp4. Успешно использовал команду find для вывода списка файлов кода wc -l $(git ls-files | find *.m *.h)
Показать ещё 6 комментариев
28

Лучшее решение, мне все равно, похоронено в комментариях @emhemient ответа. Я просто потянул его сюда, чтобы он не остался незамеченным. Для этого нужно перейти к @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. Будут подсчитаны пустые строки.

  • 1
    git mktree </dev/null или true|git mktree или git mktree <&- или :|git mktree для счетчиков нажатий клавиш среди нас :-) - свободное пустое дерево, плавающее вокруг репо, не повредит ничему.
  • 1
    Для тех, кто интересуется, что это за хэш-код: stackoverflow.com/questions/9765453/…
5

Я играл с 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

  • 2
    Это, казалось, ответило кусками для меня. Использование вашего grep в сочетании с решением Джастина Аквадро хорошо для меня. wc -l $ (git ls-files | grep "\ (. html \ | .css \ | .js \ | .php \ | .json \ | .sh \) $")
  • 0
    @PeterMark решение в вашем комментарии работает для меня
3

Это работает как cloc 1.68:

cloc --vcs=git

3

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

git grep ^ | wc -l

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

3

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

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

Я сделал это:

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

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

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

Или:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню