Примечание: изначально это было опубликовано в исходном{d} блоге.

На прошлой неделе мы имели честь участвовать в MSR’18, где два члена нашей команды, Вадим Марковцев и Варен Лонг, представили исследовательскую работу, которую они написали на нашем последнем наборе данных: Public Git Archive.

Public Git Archive — это результат многомесячных усилий по созданию набора данных, подходящего для обучения машинному обучению на моделях исходного кода (также известного как MLonCode).

содержимое набора данных

Набор данных содержит 3 ТБ репозиториев с GitHub, готовых к загрузке. Это включает в себя все содержимое (метаданные git и содержимое файлов) для всех репозиториев на GitHub с 50 или более звездами. Список репозиториев был получен из проекта GHTorrent, а именно из снимка от 1 января 2018 года. GHTorrent предоставляет информацию о репозиториях GitHub, но, к сожалению, не включает содержимое файлов.

Укорененные репозитории

Чтобы избежать ненужных повторяющихся файлов, мы объединили все репозитории, объединив все деревья git, содержащие общий корень, в соответствии с их хэшами коммитов. Повторение файлов по-прежнему имеет место, когда два или более репозитория содержат копии одного файла, но не имеют общего корня.

На рисунке ниже визуально показано, как два репозитория объединяются в один или укореняются.

Просто чтобы дать вам представление о размере набора данных, давайте сравним его с предыдущими наборами данных:

А поскольку образ стоит тысячи таблиц, здесь вы можете увидеть размер Public Git Archive по сравнению с другими наборами данных. Обратите внимание, что шкала логарифмическая!

Точно так же количество строк кода показывает размер публичного архива Git.

Сравнение pga с ghtorrent и набором данных bigquery github

Многие люди уже спрашивали нас, как этот набор данных сравнивается с двумя связанными проектами: GHTorrent и BigQuery.

Основное отличие от GHTorrent заключается в том, что хотя GHTorrent предоставляет только метаданные о репозиториях, Public Git Archive также включает в себя содержимое и метаданные репозитория git. Это означает, что вы можете фактически анализировать исходный код, а не только метаданные о нем.

С другой стороны, данные GitHub в BigQuery действительно содержат исходный код, но только последнюю версию для каждого файла. Хотя это невероятно полезно, этого недостаточно для некоторых анализов, где требуется полная история репозитория.

Схема общедоступного архива git

Public Git Archive предоставляет индексный файл с информацией, которую можно использовать для выбора частей набора данных, которые можно загрузить. Это включает в себя:

  • URL репозитория,
  • имя шива с содержимым репозитория
  • общее количество файлов, строк кода и байтов,
  • общее количество коммитов и коммитов в пути HEAD к корню,
  • список языков, обнаруженных в репозитории с помощью enry,
  • лицензия обнаружена в репозитории с помощью go-license-detector.

Вы можете найти задокументированную схему набора данных на GitHub.

Каждый файл siva содержит один или несколько репозиториев GitHub, сжатых в удобном для добавления формате. Репозитории содержат все коммиты, ссылки, ветки, содержимое файлов и каждого репозитория, аналогично тому, что можно получить, клонировав репозиторий напрямую.

Скачайте прямо сейчас!

Вы можете загрузить индексный файл, найти siva файлов, соответствующих интересующим вас репозиториям, и загрузить один за другим.

Чтобы упростить эту задачу, мы также выпустили инструмент под названием pga. pga может фильтровать и загружать разделы наборов данных с помощью простого интерфейса командной строки. Вы можете скачать его со страницы релизов на github.com/src-d/datasets. В качестве альтернативы, если Go уже установлен на вашем компьютере, вы можете просто запустить go get github.com/src-d/datasets/PublicGitArchive/pga.

После установки вывести список всех репозиториев в наборе данных так же просто, как запустить pga list. Чтобы перечислить только репозитории, содержащие некоторую часть Java:

▶️ pga list -l java
https://github.com/karlisson/1001
https://github.com/thiagolocatelli/android-uitableview
https://github.com/JakeWharton/Android-ViewPagerIndicator
...

, или показать только репозитории в организации src-d:

▶️ pga list -u /src-d/
https://github.com/src-d/beanstool
https://github.com/src-d/kmcuda
https://github.com/src-d/hercules
...

Чтобы загрузить данные, а не просто перечислить репозитории, замените list на get.

Наконец, вы также можете использовать pga для представления индекса в различных форматах, таких как CSV или JSON:

Это может быть полезно, когда необходим более сложный фильтр индекса. Например, если вы хотите загрузить все исходные {d} репозитории с лицензиями Apache v2, вы можете выполнить следующую команду:

▶️ pga list -u /src-d/ -f json | grep "Apache-2.0" | jq -r ".sivaFilenames[]" | pga get -i
downloading siva files by name from stdin
filter flags will be ignored
 0 / 5 [------------------------------------------------------]   0.00%

Сначала мы перечисляем все репозитории с исходным кодом{d} в формате JSON, выбираем те из них, которые используют лицензии Apache v2, затем используем jq для извлечения соответствующих имен файлов и загружаем их с помощью pga get -i.

Лицензия

Индекс Public Git Archive доступен только для исследовательских целей и по двойной лицензии Open Database License (ODBL) и CC-BY-SA-NC 4.0.

Мы будем рады услышать, если вы решите использовать его. Вы можете связаться с нами по электронной почте [email protected] или присоединиться к нашему сообществу Slack, следуя приведенным ниже инструкциям.

Черный список

Мы понимаем, что некоторые проекты GitHub со временем могут стать частными или удаленными. Предыдущие моментальные снимки набора данных будут по-прежнему включать такой мертвый код. Если вы являетесь автором и хотите удалить свой проект из всех существующих и будущих публичных снимков, отправьте запрос на [email protected].