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


767

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

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

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

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

Ответы:


1142

xargs будет делать то, что вы хотите:

git ls-files | xargs cat | wc -l

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

git ls-files | xargs wc -l

11
Я думаю, тривиально; Как насчет включить только файлы исходного кода (например, * .cpp). У нас есть несколько файлов бинарников :)
Даниэль

39
Засунь grep cpp |там раньше xargs, потом.
Карл Норум

35
Используйте, git ls-files -z | xargs -0 wc -lесли у вас есть файлы с пробелами в имени.
mpontillo

34
Для включения / исключения определенных файлов используйте: git ls-files | grep -P ".*(hpp|cpp)" | xargs wc -lгде часть grep это любое регулярное выражение perl, которое вы хотите!
Габриэль

29
Если вас интересуют только файлы .java, которые вы можете использоватьgit ls-files | grep "\.java$" | xargs wc -l
dseibert

352
git diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904

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

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

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

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


45
Кстати, вы можете получить этот хэш, запустив git hash-object -t tree /dev/null.
Эфимент

84
И еще более кратко:git diff --stat `git hash-object -t tree /dev/null`
rpetrich

10
Это лучшее решение, поскольку оно не учитывает двоичные файлы, такие как архивы или изображения, которые учитываются в приведенной выше версии!
BrainStone

31
+1 Мне больше нравится это решение, так как двоичные файлы не учитываются. Также нас действительно интересует последняя строка вывода git diff:git diff --stat `git hash-object -t tree /dev/null` | tail -1
Габриэле Петронелла

31
вместо этого используйте, git diff --shortstat `git hash-object -t tree /dev/null` чтобы получить последнюю строку, tail не нужен.
Джим Вольф

316

Если вам нужен этот счет, потому что вы хотите получить представление о масштабах проекта, вы можете предпочесть вывод 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с помощью Homebrew .

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


4
CLOC игнорирует некоторые языки, такие как TypeScript.
Марсело Камарго

6
@MarceloCamargo на данный момент поддерживается TypeScript
Александр

1
Для новичка лучше выполнить «cloc DIRECTORY_WHERE_YOUR_GIT_IN» для вычисления строк.
Ши

Полное описание здесь: github.com/AlDanial/cloc и двоичные файлы здесь: github.com/AlDanial/cloc/releases/tag/v1.70
Питер Сзанто,

15
Вы можете просто использовать cloc --vcs gitэти дни, что позволяет избежать некоторых крайних случаев с плохо именованными файлами (или слишком многими из них).
Seanf

56

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

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

wc -l $(git ls-files)

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

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


Это замечательно, но, похоже, не работает для путей, которые содержат пробелы. Есть ли способ решить это?
Леа Хейс,

1
Были проблемы с grep '. * \. M', собирающим двоичные файлы, такие как .mp3, .mp4. Успех с использованием команды find для просмотра файлов кодаwc -l $(git ls-files | find *.m *.h)
Tico Ballagas,

3
@LeaHayes это один из способов wc -l --files0-from=<(git ls-files -z). <(COMMAND)Синтаксис возвращает имя файла, содержимое которого являются результатом COMMAND.
доллар

@buck Спасибо, но я получаю сообщение об ошибке, когда пытаюсь выполнить команду «невозможно создать канал для замены процесса: функция не реализована wc: нераспознанная опция --files0-from =». Любые идеи?
Леа Хейс

1
@LeaHayes Я придумал этот скрипт, который, я думаю, будет работать для вас: `` `#! / Bin / bash results = $ (git ls-files | xargs -d '\ n' wc -l) let grand_total = 0 для x в $ (выведите «$ results» | egrep '[[: digit:]] + всего $'); do let grand_total + = $ (echo "$ x" | awk '{print $ 1}') done echo "$ {results}" echo "общий итог: $ {grand_total}" `` `
доллар

45

В любом случае, лучшее решение для меня - в комментариях к ответу @ 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. Пустые строки подсчитываются.


1
git mktree </dev/nullили true|git mktreeили git mktree <&-или :|git mktreeдля счетчиков нажатий клавиш среди нас :-) - свободное пустое дерево, плавающее вокруг репо, не повредит ничему.
до

2
Для тех, кто интересуется, что это за хэш-код: stackoverflow.com/questions/9765453/…
Tejas Kale

19

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

cloc --vcs=git


--vcsне работал для меня, может быть, он был удален cloc .в то время как на Git РЕПО работал, OTOH.
acdcjunior

13

Я играл с cmder ( http://gooseberrycreative.com/cmder/ ) и хотел посчитать строки html, css, java и javascript. Хотя некоторые из приведенных выше ответов сработали, orшаблон в grep не сработал - я нашел здесь ( /unix/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 \) $")
Питер Марк

9

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

git grep ^ | wc -l

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


3

Я сделал это:

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

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


3

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

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

1

Пытаться:

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

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


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

Или:

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

0

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

  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, поиск в индексе, а не в рабочем дереве (включая незафиксированные файлы)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.