Ответы:
xargs
будет делать то, что вы хотите:
git ls-files | xargs cat | wc -l
Но с большей информацией и, возможно, лучше, вы можете сделать:
git ls-files | xargs wc -l
grep cpp |
там раньше xargs
, потом.
git ls-files -z | xargs -0 wc -l
если у вас есть файлы с пробелами в имени.
git ls-files | grep -P ".*(hpp|cpp)" | xargs wc -l
где часть grep это любое регулярное выражение perl, которое вы хотите!
git ls-files | grep "\.java$" | xargs wc -l
git diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904
Это показывает отличия от пустого дерева до вашего текущего рабочего дерева. Что происходит для подсчета всех строк в вашем текущем рабочем дереве.
Чтобы получить числа в вашем текущем рабочем дереве, сделайте это:
git diff --shortstat `git hash-object -t tree /dev/null`
Это даст вам строку, как 1770 files changed, 166776 insertions(+)
.
git hash-object -t tree /dev/null
.
git diff --stat `git hash-object -t tree /dev/null`
git diff --stat `git hash-object -t tree /dev/null` | tail -1
git diff --shortstat `git hash-object -t tree /dev/null`
чтобы получить последнюю строку, tail не нужен.
Если вам нужен этот счет, потому что вы хотите получить представление о масштабах проекта, вы можете предпочесть вывод 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 .
cloc --vcs git
эти дни, что позволяет избежать некоторых крайних случаев с плохо именованными файлами (или слишком многими из них).
Я столкнулся с проблемами пакетной обработки git ls-files | xargs wc -l
при работе с большим количеством файлов, когда количество строк будет разбито на несколько total
строк.
Отвечая на вопрос, почему утилита wc генерирует несколько строк с «total»? Я нашел следующую команду, чтобы обойти проблему:
wc -l $(git ls-files)
Или, если вы хотите просмотреть только некоторые файлы, например, код:
wc -l $(git ls-files | grep '.*\.cs')
wc -l $(git ls-files | find *.m *.h)
wc -l --files0-from=<(git ls-files -z)
. <(COMMAND)
Синтаксис возвращает имя файла, содержимое которого являются результатом COMMAND
.
В любом случае, лучшее решение для меня - в комментариях к ответу @ 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 mktree </dev/null
или true|git mktree
или git mktree <&-
или :|git mktree
для счетчиков нажатий клавиш среди нас :-) - свободное пустое дерево, плавающее вокруг репо, не повредит ничему.
Это работает с часов 1.68:
cloc --vcs=git
--vcs
не работал для меня, может быть, он был удален cloc .
в то время как на Git РЕПО работал, OTOH.
Я играл с 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
Я использую следующее:
git grep ^ | wc -l
Это ищет во всех файлах, проверенных git, регулярное выражение ^
, которое представляет начало строки, поэтому эта команда выдает общее количество строк!
Я сделал это:
git ls-files | xargs file | grep "ASCII" | cut -d : -f 1 | xargs wc -l
это работает, если вы считаете все текстовые файлы в хранилище интересующими вас файлами. Если некоторые из них считаются документацией и т. Д., Можно добавить фильтр исключения.
Этот инструмент на github https://github.com/flosse/sloc может дать вывод более информативным способом. Это создаст статистику вашего исходного кода:
: | git mktree | git diff --shortstat --stdin
Или:
git ls-tree @ | sed '1i\\' | git mktree --batch | xargs | git diff-tree --shortstat --stdin
В зависимости от того, хотите ли вы включить двоичные файлы, есть два решения.
git grep --cached -al '' | xargs -P 4 cat | wc -l
git grep --cached -Il '' | xargs -P 4 cat | wc -l
«xargs -P 4» означает, что он может читать файлы, используя четыре параллельных процесса. Это может быть очень полезно, если вы сканируете очень большие репозитории. В зависимости от мощности машины вы можете увеличить количество процессов.
-a, обрабатывать двоичные файлы как текст (Включить двоичные файлы)
-l '', показывать только имена файлов вместо совпадающих строк (Сканировать только непустые файлы)
-I, не сопоставлять шаблоны в двоичных файлах (
исключая двоичные файлы) --cached, поиск в индексе, а не в рабочем дереве (включая незафиксированные файлы)