Порахуйте кількість рядків у сховищі git


766

Як би я підрахував загальну кількість рядків, присутніх у всіх файлах у сховищі git?

git ls-files дає мені список файлів, відслідковуваних git.

Я шукаю команду для catвсіх цих файлів. Щось на зразок

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

Відповіді:


1139

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 частина - це будь-який пергегель, який ви хочете!
Габріель

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` для отримання останнього рядка, хвіст не потрібен.
Джим Уолф

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.
Marcelo Camargo

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 =". Будь-які ідеї?
Lea Hayes

1
@LeaHayes Я придумав цей скрипт, який, на мою думку, спрацює для вас: `` `#! / Bin / bash results = $ (git ls-files | xargs -d '\ n' wc -l) хай grand_total = 0 для x in $ (відлуння "$ results" | egrep '[[: цифра:]] + загальна $'); нехай grand_total + = $ (відлуння "$ x" | awk '{print $ 1}') виконано 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для лічильників натискань на клавіші серед нас :-) - запасне порожнє дерево, що плаває навколо репо, нічого не зашкодить.
jthill

2
Для людей, які цікавляться, що таке хеш із синього кольору: stackoverflow.com/questions/9765453/…
Tejas Kale

19

Це працює на Cloc 1.68:

cloc --vcs=git


--vcsне працювало для мене, можливо, його видалили. cloc .поки в git repo працювали, OTOH.
acdcjunior

13

Я бавився з 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


2
На це, здавалося, відповідали шматки. Використання вашої грепи в поєднанні з рішенням Джастіна Аквадро спричинило мене добре. 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, обробляти двійкові файли як текст (Включити Binary)
    -l «», показують тільки імена файлів , а не збігаються рядків (сканування тільки не порожні файли)
    -I, не збігаються структури в бінарних файлах (Виключений Binary)
    --cached, пошук в індексі замість робочого дерева (включення непосланих файлів)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.