Чи можете ви отримати кількість рядків коду з сховища GitHub?


417

У сховищі GitHub можна побачити "статистику мови", яка відображає відсоток проекту, написаного мовою. Однак не відображається, з яких рядків коду складається проект. Часто мені хочеться швидко скласти враження про масштаб і складність проекту, і кількість рядків коду може справити гарне перше враження. 500 рядків коду передбачає відносно простий проект, 100 000 рядків коду означає дуже великий / складний проект.

Отже, чи можна отримати рядки коду, написані різними мовами, із сховища GitHub, бажано, не клонуючи його?


Питання « Підрахунок кількості рядків у сховищі git » задає питання про підрахунок рядків коду у локальному сховищі Git, але:

  1. Ви повинні клонувати проект, який може бути масовим. Наприклад, клонування такого проекту, як Вино, займає багато років.
  2. Ви будете рахувати рядки у файлах, які не обов'язково повинні бути кодовими, як і файли i13n.
  3. Якщо ви порахуєте лише (наприклад) файли Ruby, ви, можливо, пропустите величезну кількість коду іншими мовами, наприклад, JavaScript. Ви повинні заздалегідь знати, якими мовами користується проект. Вам також доведеться повторити підрахунок за кожну мову, якою користується проект.

Загалом, це потенційно занадто багато часу, щоб "швидко перевірити масштаб проекту".


4
@Schwern: Не дуже думав про це. Думаю, остання комісія головного відділення.
Хубро

8
@Abizern: Це вагома причина для закриття питання? Я намагаюся знайти це в керівництві . Мій план полягав у тому, щоб спершу запитати. Якщо це виявиться марним, я б попросив службу підтримки Github та опублікував їх інформацію як відповідь тут.
Хубро

7
@Abizern: Дивіться на тему . Там написано, що ви можете задавати питання про "програмні засоби, які зазвичай використовуються програмістами".
Хубро

1
@Hubro 1 Я вирішив git clone --depth 1. Що стосується 2 та 3, я підозрюю, що там є програмне забезпечення, яке може зробити аналіз для вас, і ви можете багато здогадуватися на основі розширень файлів, але я маю пекельний час, придумавши хороший пошук термін знайти вказане програмне забезпечення. Можливо, вам потрібно задати інше питання.
Шверн

1
На сайті codetabs.com/count-loc/count-loc-online.html є онлайн-інструмент , який не пробував, якщо це добре.
Тгр

Відповіді:


298

Сценарій оболонки, cloc-git

Цей скрипт оболонки можна використовувати для підрахунку кількості рядків у віддаленому сховищі Git за допомогою однієї команди:

#!/usr/bin/env bash
git clone --depth 1 "$1" temp-linecount-repo &&
  printf "('temp-linecount-repo' will be deleted automatically)\n\n\n" &&
  cloc temp-linecount-repo &&
  rm -rf temp-linecount-repo

Установка

Цей скрипт вимагає встановити CLOC ("Лічильник ліній коду"). clocможливо, він може бути встановлений разом із вашим менеджером пакунків - наприклад, brew install clocз Homebrew . Існує також зображення докера, опубліковане підmribeiro/cloc .

Ви можете встановити скрипт, збереживши його код у файл cloc-git, запустивши його chmod +x cloc-git, а потім перемістивши файл у папку вашого $PATHтипу /usr/local/bin.

Використання

Сценарій бере один аргумент, який є будь-якою URL-адресою git clone. Прикладами є https://github.com/evalEmpire/perl5i.git(HTTPS) або git@github.com:evalEmpire/perl5i.git(SSH). Ви можете отримати цю URL-адресу з будь-якої сторінки проекту GitHub, натиснувши «Клонувати або завантажити».

Приклад виводу:

$ cloc-git https://github.com/evalEmpire/perl5i.git
Cloning into 'temp-linecount-repo'...
remote: Counting objects: 200, done.
remote: Compressing objects: 100% (182/182), done.
remote: Total 200 (delta 13), reused 158 (delta 9), pack-reused 0
Receiving objects: 100% (200/200), 296.52 KiB | 110.00 KiB/s, done.
Resolving deltas: 100% (13/13), done.
Checking connectivity... done.
('temp-linecount-repo' will be deleted automatically)


     171 text files.
     166 unique files.                                          
      17 files ignored.

http://cloc.sourceforge.net v 1.62  T=1.13 s (134.1 files/s, 9764.6 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Perl                           149           2795           1425           6382
JSON                             1              0              0            270
YAML                             2              0              0            198
-------------------------------------------------------------------------------
SUM:                           152           2795           1425           6850
-------------------------------------------------------------------------------

Альтернативи

Запускайте команди вручну

Якщо ви не хочете турбуватися про збереження та встановлення сценарію оболонки, ви можете запустити команди вручну. Приклад:

$ git clone --depth 1 https://github.com/evalEmpire/perl5i.git
$ cloc perl5i
$ rm -rf perl5i

Лінгвіст

Якщо ви хочете, щоб результати точно відповідали мовним відсоткам GitHub, можете спробувати встановити Linguist замість CLOC . Відповідно до його README , вам потрібно, gem install linguistа потім запустити linguist. Я не зміг змусити його працювати ( випуск №2223 ).


6
Оригінальне питання, вказане без клонування репо.
linuxdan

12
@linuxdan Мій сценарій не клонує всю репо; це передає --depth 1лише для завантаження останньої версії. У більшості репостів це дозволяє уникнути занепокоєння оригінального питання щодо клонування.
Рорі О'Кайн

2
чоловіче, це чудово працює! завжди цікавився, скільки рядків у мене закодовано)
Анатолій Якимчук

@ RoryO'Kane ми можемо використовувати clocдля отримання рядків коду у сховищі github із клонуванням репо в нашу машину (через Інтернет). вище наведені cloc-gitасло перші клони до проекту, перш ніж починати відлік числа рядків
Касун Сіямбалапітія

@KasunSiyambalapitiya Вибачте, я не знаю жодного веб-сайту, який працює clocдля вас. Для того, clocщоб рахувати рядки в коді, ваш комп'ютер повинен завантажити цей код, хоча лише тимчасово. Зауважте, що навіть веб-браузери технічно завантажують веб-сторінки, коли ви відвідуєте їх; вони просто зберігають їх у пам'яті, а не на диску.
Рорі О'Кайн

226

Можна запустити щось на кшталт

git ls-files | xargs wc -l

що дасть вам загальну кількість →

рядки коду

Або скористайтеся цим інструментом → http://line-count.herokuapp.com/


8
Коротка відповідь на питання (пошук цього номера за допомогою github) - Ні. Ваш підхід є другою найкращою альтернативою, тим більше, що ми можемо відфільтрувати всі файли, які нам потрібно рахувати.
Бернард

32
Якщо ви хочете фільтрувати, наприклад, код Python : git ls-files | grep '\.py' | xargs wc -l.
Феліпе СС Шнайдер

3
Я робив xargsдля wc -lвсіх файлів вручну потім використовувати awkпідсумувати стовпець, OMG це так набагато простіше.
sdkks

1
Цей простий підхід включає коментарі у файлах. Коментарі та порожні рядки не завжди вважаються "рядками коду".
Марк Стосберг

2
Ну, документація - це величезна частина коду. Де б ви насправді намалювали лінію, якщо ви кинете коментарі. Що з коментарями, що містять інформацію про код, як парами, а що за коментарі, які вимикають ESLint для наступного рядка, а що стосується рядків, які мають 80% коментарів після деякого коду. Подивіться, куди я йду з цим.
Ахмад

128

Існує розширення для браузера Google Chrome - GLOC яке працює для публічних та приватних репостів.

Підраховує кількість рядків коду проекту від:

  • сторінка з деталізацією проекту
  • репозиторії користувачів
  • сторінка організації
  • на сторінці результатів пошуку
  • модна сторінка
  • вивчити сторінку

введіть тут опис зображення введіть тут опис зображення введіть тут опис зображення введіть тут опис зображення введіть тут опис зображення введіть тут опис зображення введіть тут опис зображення


3
незважаючи на те, що, схоже, це не працює для приватних сховищ
Michail Michailidis

4
@MichailMichailidis Дякую за пропозицію. Я це виправлю.
Артем Соловев

4
@Taurus мій коментар не мав на увазі як CR - з точки зору зручності використання градієнт виконує цю роботу (з тієї причини, яку ви згадали) Я мав на увазі, що я не шанувальник обраних кольорів, але це лише моя (суб'єктивна) думка. Ура :)
tech4242

2
@hellyale впевнений. через кілька тижнів
Артем Соловев

2
@hellyale Це працює і для приватних репостів. Оновлення розширення. Є ще нові функції для використання
Артем Соловев

70

Якщо ви перейдете на сторінку графіків / дописувачів, ви зможете побачити список усіх учасників репо та кількість рядків, які вони додали та видалили.

Якщо я щось не пропускаю, віднімання сукупної кількості рядків, видалених із сукупної кількості рядків, доданих серед усіх учасників, має отримати загальну кількість рядків коду в репо. (EDIT: виявляється, я щось пропустив. Подивіться коментар orbitbot для деталей.)

ОНОВЛЕННЯ:

Ці дані також доступні в API GitHub . Тому я написав швидкий сценарій, щоб отримати дані та зробити розрахунок:

'use strict';

function countGithub(repo) {
fetch('https://api.github.com/repos/'+repo+'/stats/contributors')
    .then(response => response.json())
    .then(contributors => contributors
        .map(contributor => contributor.weeks
            .reduce((lineCount, week) => lineCount + week.a - week.d, 0)))
    .then(lineCounts => lineCounts.reduce((lineTotal, lineCount) => lineTotal + lineCount))
    .then(lines => window.alert(lines));
}

countGithub('jquery/jquery'); // or count anything you like

Просто вставте його в фрагмент Chrome DevTools, змініть репо і натисніть запустити.

Відмова (завдяки lovasoa ):

Отримайте результати цього методу із зерном солі, оскільки для деяких репостів (sorich87 / bootstrap-tour) це призводить до негативних значень, що може вказувати на те, що в даних, повернених з API GitHub, щось не так.

ОНОВЛЕННЯ:

Схоже, цей метод обчислення загальної кількості рядків не зовсім надійний. Перегляньте коментар orbitbot для деталей.


Правильно. Але в деяких випадках, коли проект є великим проектом спільноти з відкритим кодом, такий підрахунок неможливо.
франклін

@franklin Однозначно. Однак ці дані також доступні в API GitHub , тому ви можете написати сценарій, щоб обчислити загальну кількість рядків досить легко. Я оновив свою відповідь швидким сценарієм, який я щойно написав.
Льюїс

Простіше було використовувати API code_frequecy. Даючи: fetch("https://api.github.com/repos/jquery/jquery/stats/code_frequency").then(x=>x.json()).then(x=>alert(x.reduce((total,changes)=>total+changes[1]+changes[2],0)))
lovasoa

Гммм ... Цікаво: протестуйте свій код на sorich87 / bootstrap-tour. Результат - негативний.
lovasoa

3
@Lewis Я думаю, що ви нехтуєте тим, що додані / вилучені рядки в одному комітеті можуть бути такими ж, як і інші коміти, fe при об'єднанні гілок тощо. Крім того, дані про внески Github для профілів користувачів підраховуються лише з гілки за замовчуванням або gh-сторінок, тому може статися щось подібне для статистики комісій / рядків: help.github.com/articles/… . Також зауважте, що статистика профілю користувача підраховується лише за попередній рік, але я думаю, що статистика фіксування на сторінці графіка є постійною.
orbitbot

38

Ви можете клонувати лише останню фіксацію за допомогою, git clone --depth 1 <url>а потім виконувати власний аналіз за допомогою Linguist , того самого програмного забезпечення, яке використовує Github. Це єдиний спосіб, коли я знаю, що ви збираєтеся отримати рядки коду.

Інший варіант - використовувати API для переліку мов, якими користується проект . Він не дає їх у рядках, а в байтах. Наприклад...

$ curl https://api.github.com/repos/evalEmpire/perl5i/languages
{
  "Perl": 274835
}

Хоча взяти це з зерном солі, цей проект включає YAML та JSON, які веб-сайт визнає, але API цього не робить.

Нарешті, ви можете скористатися пошуком коду, щоб запитати, які файли відповідають даній мові. Цей приклад запитує, які файли в perl5i є Perl. https://api.github.com/search/code?q=language:perl+repo:evalEmpire/perl5i. Це не дасть вам рядків, і вам доведеться запитувати розмір файлу окремо, використовуючи повернений urlдля кожного файл.


Класно, не знав про це. Чи можете ви підтвердити, що це неможливо зробити на веб-сайті Github?
Hubro

Я не можу підтвердити це, але я не бачу нічого в API чи на веб-сайті Github, що дасть вам рядки. Це все байти або відсотки. Яке обґрунтування робити це через API замість клонування?
Шверн

Добре, спасибі за інформацію, хоча. Я попрошу підтримки Github.
Хубро

Лінгвіст виглядає круто, але як змусити його показати вам рядки коду? Схоже, він показує байти за замовчуванням, як і API.
Хубро

@Hubro Dunno, можливо, доведеться виправити це.
Шверн

33

Наразі це неможливо на Github.com або їх API

Я поговорив із службою підтримки клієнтів і підтвердив, що цього не можна робити на github.com. Вони передали пропозицію команді Github, але, сподіваємось, це стане можливим у майбутньому. Якщо так, я обов'язково відредагую цю відповідь.

Тим часом, відповідь Рорі О'Кайн - це блискуча альтернатива, заснована на clocнеглибокому клоні репо.


2
Не безпосередньо, але їх API API має всі дані, необхідні для обчислення їх самостійно. Дивіться мою відповідь нижче для швидкого сценарію, який робить це.
Льюїс

12

Ви можете використовувати API GitHub, щоб отримати слот, як показано нижче

function getSloc(repo, tries) {

    //repo is the repo's path
    if (!repo) {
        return Promise.reject(new Error("No repo provided"));
    }

    //GitHub's API may return an empty object the first time it is accessed
    //We can try several times then stop
    if (tries === 0) {
        return Promise.reject(new Error("Too many tries"));
    }

    let url = "https://api.github.com/repos" + repo + "/stats/code_frequency";

    return fetch(url)
        .then(x => x.json())
        .then(x => x.reduce((total, changes) => total + changes[1] + changes[2], 0))
        .catch(err => getSloc(repo, tries - 1));
}

Особисто я зробив хромоване розширення, яке показує кількість SLOC у списку проектів github та на сторінці деталізації проекту. Ви також можете встановити свій особистий маркер доступу для доступу до приватних сховищ та обійти обмеження api-швидкості.

Ви можете завантажити тут https://chrome.google.com/webstore/detail/github-sloc/fkjjjamhihnjmihibcmdnianbcbccpnn

Вихідний код доступний тут https://github.com/martianyi/github-sloc


Як хромоване розширення визначається SLOC? Усі типи файлів? Виключити конкретні каталоги?
Бретт Райнхард

@BrettReinhard Він заснований на кількості доповнень та видалень за тиждень , я думаю, що він включає всі файли.
Yi Kai

Чи це не просто повертає кількість змін за останній тиждень?
Йоганнес «риба» Зімке

@ Johannes'fish'Ziemke Ні, він повертається щотижня
Yi Kai

11

Firefox надбудова Github SLOC

Я написав невеликий додаток для Firefox, який друкує кількість рядків коду на сторінках проекту github: Github SLOC


Чудовий плагін, дуже корисний! Чи знаєте ви, чи можна змусити це працювати з приватними репостами? Схоже, це лише показ LOC на публічних репортажах.
rococo

Посилання є мертвою, і після пошуку вручну, здається, цей плагін вже не існує.
dCSeven

Існує запит на надання GLOC доступним і для Firefox, і розробник здається відкритим до ідеї: github.com/artem-solovev/gloc/isissue/23
miyalys

1
@miyalys Зроблено зараз: addons.mozilla.org/en-US/firefox/addon/gloc
Шахаф Зохар

7

Якщо питання "чи можете ви швидко отримати кількість ЛІНІЙ github repo", відповідь "ні", як зазначено в інших відповідях.

Однак якщо питання "чи можете ви швидко перевірити СКАЛЬ проекту", я зазвичай оцінюю проект, дивлячись на його розмір. Звичайно, розмір буде включати дельти від усіх активних комітетів, але це хороший показник, оскільки порядок величини досить близький.

Напр

Наскільки великий проект "докер"?

У своєму браузері введіть api.github.com/repos/ORG_NAME/PROJECT_NAME, тобто api.github.com/repos/docker/docker

У хеші відповідей ви можете знайти атрибут size:

{
    ...
    size: 161432,
    ...
}

Це має дати вам уявлення про відносну масштабність проекту. Здається, що це число в КБ, але коли я перевірив це на своєму комп’ютері, він насправді менший, навіть незважаючи на порядок. (161432KB = 161MB, du -s -h docker = 65MB)


1
npm install sloc -g
git clone --depth 1 https://github.com/vuejs/vue/
sloc ".\vue\src" --format cli-table
rm -rf ".\vue\"

Інструкції та пояснення

  1. Встановіть sloc з npm , інструмент командного рядка ( Node.js потрібно встановити).
npm install sloc -g
  1. Клон неглибокого сховища (швидше завантаження, ніж повний клон).
git clone --depth 1 https://github.com/facebook/react/
  1. Запустіть слот і вкажіть шлях, який слід проаналізувати.
sloc ".\react\src" --format cli-table

sloc підтримує форматування виводу у вигляді cli-table, як jsonабо csv. Регулярні вирази можна використовувати для виключення файлів і папок ( Додаткова інформація про npm ).

  1. Видалити папку сховища (необов’язково)

Powershell: rm -r -force ".\react\"або на Mac / Unix:rm -rf ".\react\"

Скріншоти виконаних кроків (кліп-таблиця):

виведення лінійки як таблиця acli

вихід у слоні (без аргументів):

виведення лінійки без аргументів


Схоже, це не працює для файлів R на зразок .R або .Rmd
jzadra

1

Проведіть висновок із кількості рядків у кожному файлі, sortщоб упорядкувати файли за кількістю рядків. git ls-files | xargs wc -l |sort -n



0

Відкрийте термінал і запустіть наступне:

curl https://api.codetabs.com/v1/loc?github=username/reponame
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.