Можете ли вы получить количество строк кода из репозитория GitHub?

419

В репозитории GitHub вы можете увидеть «статистику языка», которая отображает процент проекта, написанного на языке. Однако он не отображает количество строк кода, из которых состоит проект. Часто я хочу быстро получить представление о масштабе и сложности проекта, а количество строк кода может дать хорошее первое впечатление. 500 строк кода подразумевают относительно простой проект, 100 000 строк кода подразумевают очень большой / сложный проект.

Итак, возможно ли получить строки кода, написанные на разных языках, из репозитория GitHub, желательно без его клонирования?


Вопрос « Подсчитать количество строк в репозитории git » спрашивает, как посчитать строки кода в локальном репозитории Git, но:

  1. Вы должны клонировать проект, который может быть массовым. Например, клонирование такого проекта, как Wine, занимает много времени.
  2. Вы будете считать строки в файлах, которые не обязательно будут кодом, например, файлы i13n.
  3. Если вы учитываете только (например) файлы Ruby, вы можете пропустить огромное количество кода на других языках, таких как JavaScript. Вы должны заранее знать, какие языки использует проект. Вы также должны будете повторить счет для каждого языка, который использует проект.

В общем, это потенциально слишком много времени для «быстрой проверки масштаба проекта».

Hubro
источник
4
@Schwern: действительно не думал об этом. Полагаю, последний коммит мастер ветки.
Hubro
8
@Abizern: это веская причина для закрытия вопроса? Я пытаюсь найти это в руководстве . Мой план состоял в том, чтобы сначала спросить ТАК. Если это окажется бесполезным, я бы попросил службу поддержки Github и разместил их информацию в качестве ответа здесь.
Hubro
7
@Abizern: Смотрите по теме . В нем говорится, что вы можете задавать вопросы о «программных инструментах, обычно используемых программистами».
Hubro
1
@Hubro 1 Я решил с git clone --depth 1. Что касается 2 и 3, я подозреваю, что есть программное обеспечение, которое может сделать анализ для вас, и вы можете делать много предположений, основываясь на расширениях файлов, но у меня чертовски много времени, чтобы придумать хороший поиск срок, чтобы найти указанное программное обеспечение. Может быть, вам нужно задать еще один вопрос.
Шверн
1
На сайте codetabs.com/count-loc/count-loc-online.html есть онлайн-инструмент , не пробовал, если он полезен.
Tgr

Ответы:

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считать строки в коде, ваш компьютер должен загрузить этот код, но только временно. Обратите внимание, что даже веб-браузеры технически загружают веб-страницы при их посещении; они просто сохраняют их в памяти, а не на диск.
Рори О'Кейн
228

Вы можете запустить что-то вроде

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
Ну, документация - огромная часть кода. Где бы вы провели черту, если бы выкинули комментарии. Как насчет комментариев, которые содержат информацию о коде, например, params, как насчет комментариев, которые отключают ESLint для следующей строки - как насчет строк, которые на 80% являются комментариями после некоторого кода. Посмотрите, куда я иду с этим.
Ахмад
130

Существует расширение для браузера Google Chrome - GLOC, которое работает для публичных и частных репозиториев.

Подсчитывает количество строк кода проекта из:

  • страница сведений о проекте
  • репозитории пользователя
  • страница организации
  • страница результатов поиска
  • трендовая страница
  • исследовать страницу

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

Артем Соловьев
источник
3
проголосовал, хотя это, похоже, не работает для частных репозиториев
Михаил
4
@MichailMichailidis Спасибо за ваше предложение. Я исправлю это.
Артем Соловьев
4
@ Телец мой комментарий не был задуман как CR - с точки зрения удобства использования градиент делает свою работу (по той причине, которую вы упомянули). Я имел в виду, что я не фанат выбранных цветов, но это только мое (субъективное) мнение. Ура :)
tech4242
2
@hellyale уверен. через несколько недель
Артем Соловьев
2
@hellyale Это работает и для частных репозиториев. Обновление расширения. Есть еще новые возможности для использования
Артем Соловьев
70

Если вы перейдете на страницу графиков / участников, вы увидите список всех участников репо и сколько строк они добавили и удалили.

Если я что-то не упустил, вычитание суммарного количества удаленных строк из общего количества строк, добавленных среди всех участников, должно привести к общему количеству строк кода в репо. (РЕДАКТИРОВАТЬ: оказывается, я что-то упустил в конце концов. Посмотрите на комментарий орбитального робота для деталей.)

ОБНОВИТЬ:

Эти данные также доступны в 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.

ОБНОВИТЬ:

Похоже, этот метод для расчета общего количества строк не совсем надежен. Посмотрите на комментарий орбитального робота для деталей.

Льюис
источник
Правильно. Но в некоторых случаях, когда проект является крупным проектом сообщества с открытым исходным кодом, такого рода подсчет невозможен.
Франклин
@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)))
Ловасоа
Хммм ... Интересно: проверь свой код на sorich87 / bootstrap-tour. Результат отрицательный.
Lovasoa
3
@ Льюис, я думаю, вы игнорируете, что строки, добавленные / удаленные в одном коммите, могут быть такими же, как и в других коммитах, например, при объединении веток и т. Д., Которые все еще учитываются в общем количестве. Кроме того, например, статистика вкладов Github для профилей пользователей подсчитывается только из веток по умолчанию или gh-страниц, поэтому может быть что-то похожее для статистики commit / line: help.github.com/articles/… . Также обратите внимание, что статистика профиля пользователя учитывается только за предыдущий год, но я думаю, что статистика фиксации на странице графика является постоянной.
орбитальный робот
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для каждого файла.

Schwern
источник
Круто, не знал об этом. Можете ли вы подтвердить, что это невозможно сделать на веб-сайте Github?
Hubro
Я не могу это подтвердить, но я не вижу в API или на веб-сайте Github ничего такого, что могло бы дать вам строки. Это все байты или проценты. Какой смысл делать это через API вместо клонирования?
Шверн
Хорошо, спасибо за информацию, хотя. Я попрошу Github поддержки.
Hubro
Лингвист выглядит круто, но как вы можете показать строки кода? Похоже, он показывает байты по умолчанию, как и API.
Hubro
@Hubro Не знаю, возможно, вам придется это исправить.
Шверн
33

В настоящее время невозможно на Github.com или их API

Я поговорил со службой поддержки и подтвердил, что этого нельзя сделать на github.com. Они передали это предложение команде Github, так что, надеюсь, это будет возможно в будущем. Если так, я обязательно отредактирую этот ответ.

Между тем, ответ Рори О'Кейна - блестящая альтернатива, основанная на clocклоне репо.

Hubro
источник
2
Не напрямую, но их API статистики содержит все данные, необходимые для его расчета. Смотрите мой ответ ниже для быстрого сценария, который делает это.
Льюис
12

Вы можете использовать GitHub API для получения sloc, как в следующей функции

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));
}

Лично я сделал расширение Chrome, которое показывает количество SLOC как в списке проектов github, так и на странице сведений о проекте. Вы также можете установить свой личный токен доступа для доступа к частным репозиториям и обойти ограничение скорости API.

Вы можете скачать здесь https://chrome.google.com/webstore/detail/github-sloc/fkjjjamhihnjmihibcmdnianbcbccpnn

Исходный код доступен здесь https://github.com/martianyi/github-sloc

Йи Кай
источник
Для расширения Chrome, как определяется SLOC? Все типы файлов? Исключить конкретные каталоги?
Бретт Рейнхард
@BrettReinhard Он основан на количестве добавлений и удалений в неделю , я думаю, что он включает в себя все файлы.
И Кай
Разве это не просто возвращает количество изменений за последнюю неделю?
Йоханнес «Рыба»
@ Johannes'fish'Ziemke Нет, он возвращается каждую неделю
Yi Kai
11

Firefox дополнение Github SLOC

Я написал небольшой аддон Firefox, который печатает количество строк кода на страницах проекта github: Github SLOC

lovasoa
источник
Отличный плагин, очень полезно! Вы знаете, возможно ли заставить его работать с частными репозиториями? Кажется, он показывает только LOC на публичных репозиториях.
рококо
Ссылка не работает, и после ручного поиска кажется, что, к сожалению, этот плагин больше не существует.
dCSeven
Есть просьба сделать GLOC доступной и для Firefox, и разработчик, похоже, открыт для идеи: github.com/artem-solovev/gloc/issues/23
miyalys
1
@miyalys Это сделано сейчас: addons.mozilla.org/en-US/firefox/addon/gloc
Shachaf Zohar
7

Если вопрос «можете ли вы быстро получить КОЛИЧЕСТВО ЛИНИЙ РЕПО GitHub», ответ будет отрицательным, как указано в других ответах.

Однако, если вопрос «можете ли вы быстро проверить масштаб проекта», я обычно оцениваю проект, глядя на его размер. Конечно, размер будет включать дельты всех активных коммитов, но это хороший показатель, так как порядок величины довольно близок.

Например

Насколько велик проект «докер»?

В вашем браузере введите api.github.com/repos/ORG_NAME/PROJECT_NAME, т.е. api.github.com/repos/docker/docker

В хэше ответа вы можете найти атрибут размера:

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

Это должно дать вам представление об относительном масштабе проекта. Кажется, это число в килобайтах, но когда я проверил его на своем компьютере, оно на самом деле меньше, хотя порядок величины постоянен. (161432 КБ = 161 МБ, du -s -h докер = 65 МБ)

Джимми Да
источник
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 и укажите путь, который следует проанализировать.
sloc ".\react\src" --format cli-table

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

  1. Удалить папку репозитория (необязательно)

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

Скриншоты выполненных шагов (cli-таблица):

вывод sloc в виде acli-таблицы

Вывод sloc (без аргументов):

вывод sloc без аргументов

Тоби Обек
источник
Это не работает для файлов R, таких как .R или .Rmd
jzadra
1

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

KhmerCoder
источник
0

Откройте терминал и запустите следующее:

curl https://api.codetabs.com/v1/loc?github=username/reponame
ishandutta2007
источник