Відповіді:
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 частина - це будь-який пергегель, який ви хочете!
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`
для отримання останнього рядка, хвіст не потрібен.
Якщо ви хочете цю кількість, тому що ви хочете отримати уявлення про масштаби проекту, ви можете віддати перевагу результату 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
для лічильників натискань на клавіші серед нас :-) - запасне порожнє дерево, що плаває навколо репо, нічого не зашкодить.
Це працює на Cloc 1.68:
cloc --vcs=git
--vcs
не працювало для мене, можливо, його видалили. cloc .
поки в git repo працювали, OTOH.
Я бавився з cmder ( http://gooseberrycreative.com/cmder/ ) і хотів порахувати рядки html, css, java та javascript. Хоча деякі відповіді вище працювали, or
шаблону в грепі не було - я знайшов тут ( /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, обробляти двійкові файли як текст (Включити Binary)
-l «», показують тільки імена файлів , а не збігаються рядків (сканування тільки не порожні файли)
-I, не збігаються структури в бінарних файлах (Виключений Binary)
--cached, пошук в індексі замість робочого дерева (включення непосланих файлів)