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

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

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


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

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

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

Ответ 1

Сценарий оболочки, 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

Installation

УстановкаЭтот сценарий требует установки 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) или [email protected]: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

Лингвист

Если вы хотите, чтобы результаты точно совпадали с процентами языка GitHubs, попробуйте установить Linguist вместо CLOC. Согласно его README, вам нужно gem install linguist и затем запустить linguist. Я не смог заставить его работать (, выпуск № 2223).

Ответ 2

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

git ls-files | xargs wc -l

который даст вам общее количество →

lines of code

Или используйте этот инструмент → http://line-count.herokuapp.com/

Ответ 3

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

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

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

One repo Many repos

Ответ 4

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

Если я что-то не хватает, вычитание совокупного количества строк, удаленных из совокупного количества строк, добавленных среди всех участников, должно давать общее количество строк кода в репо. (EDIT: оказалось, что я что-то пропустил. Посмотрите комментарий orbitbot для деталей.)

UPDATE:

Эти данные также доступны в GitHub API. Поэтому я написал быстрый script для получения данных и расчета:

'use strict';

//replace jquery/jquery with the repo you're interested in
fetch('https://api.github.com/repos/jquery/jquery/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));

Ответ 5

Вы можете клонировать только последнюю фиксацию с помощью 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 для каждого файла.

Ответ 6

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

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

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

Ответ 7

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

function getSloc(repo, tries) {

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

    //GitHub 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

Ответ 8

Расширение Firefox Github SLOC

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

Ответ 9

Если возникает вопрос: "можете ли вы быстро получить ЧИСЛО ЛИНИИ репозитория github", ответ не соответствует другим ответам.

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

например.

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

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

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

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

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

Ответ 10

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 поддерживает форматирование вывода как cli-table, как json или csv. Регулярные выражения можно использовать для исключения файлов и папок (Дополнительная информация о npm).

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

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

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

sloc output as acli-table

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

sloc output without arguments