Перейти к основному содержимому

Git-репозитории

Репозиторий нужен, когда небольшую таблицу правят несколько человек и важно, кто что изменил. Историю Git показывает сам. Публикацией набор становится, когда рядом лежат описание колонок, лицензия и страница с постоянным адресом. Если на таблицу будут ссылаться в тексте, фиксируют выпуск и получают для него DOI. Файл больше предела площадки в сам Git не кладут: его прикладывают к выпуску или выносят в хранилище, а в репозитории оставляют адрес.

Площадки — GitHub, GitLab и другие. Цифры ниже сняты с документации GitHub.com и GitLab.com 14 октября 2026 года. На своём сервере пределы задаёт администратор, и перед публикацией большого файла их сверяют заново.

Когда репозитория хватает​

СитуацияКуда
Таблица до нескольких десятков мегабайт, правят двое-трое, нужна история строкрепозиторий и страница из тех же файлов
На годовой срез будут ссылаться в отчёте или статьетот же репозиторий плюс выпуск с DOI
Файл больше предела Gitоблако или вложение к выпуску, описание остаётся в репозитории. См. главу об облаке и хабах
Публикаторов много, и они не работают с Gitпортал или уже существующий каталог. См. «Когда портал не нужен»
Нужен только DOI, историю правок никто не смотритобщий репозиторий вроде Zenodo, без своего Git

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

Что положить в репозиторий​

Готовые файлы лежат в шаблонах. Их копируют и подставляют свои названия.

ФайлЗачем
README.mdчто это, за какой период, как обновляется, кто отвечает
LICENSEлицензия именно на данные
datapackage.jsonсписок файлов и смысл колонок
data/сами файлы в открытых форматах: CSV, JSON, Parquet
CITATION.cffкак сослаться. На GitHub по нему появляется кнопка «Cite this repository»

Один набор — один пакет. Пакет — это папка с описателем и файлами. Папкой может быть весь репозиторий или каталог внутри него, если наборов несколько и у каждого свой описатель. Десять несвязанных таблиц в одном репозитории без описателя — та же простыня ссылок, только в Git.

Описатель называется datapackage.json и лежит в корне пакета. Так требует стандарт Data Package 2.0: страница стандарта обновлена 25 августа 2026 года. Другое имя допустимо внутри своей системы, публиковать пакет под другим именем стандарт не советует. В шаблоне книги файл уже так назван, и в нём есть строка $schema со значением https://datapackage.org/profiles/2.0/datapackage.json. Без этой строки описатель проверяют по профилю 1.0. Поле created в профиле 2.0 — дата и время по RFC 3339, а не одна календарная дата. В шаблоне так и записано.

Живой репозиторий Country Codes этому правилу не следует: 14 октября 2026 года описатель лежал в корне как datapackage.yml. Колонки в нём описаны, файл CSV на месте, но опубликованное имя — не то, которое стандарт просит у пакета. На него можно смотреть как на образец словаря полей и как на напоминание сверить имя файла.

Если рядом с таблицей лежит скрипт, у кода и у данных часто разные лицензии. Их пишут явно: данные — в LICENSE и в datapackage.json, код — в шапке скрипта или во втором файле, на который README ссылается. Одна фраза «лицензия в корне» оставляет читателя гадать, на что она распространяется.

Скрипт, который собирает таблицу, тоже кладут в репозиторий. Обновление можно запускать автоматически: на GitHub это Actions, на GitLab — CI. Пропущенный квартал тогда виден по упавшему запуску.

Площадки и пределы​

Git хранит текст и небольшие таблицы. Большой файл раздувает историю: его копируют при каждом клонировании, даже если он уже не нужен. Отсюда пределы.

GitHub.com, бесплатный тарифGitLab.com, бесплатный тариф
Файл в обычном Gitпредупреждение, если файл больше 50 МиБ; отказ, если больше 100 МиБ. Через сайт — не больше 25 МиБ. Отдельно советуют держать один объект в пределах 1 МБ: таблица в несколько мегабайт пройдёт, клонирование и просмотр правки станут тяжелееновый файл размером 100 МиБ и больше не принимают. Через сайт — не больше 100 МиБ
Весь репозиторийлучше меньше 1 ГБ, настоятельно советуют меньше 5 ГБ. Размер папки .git рекомендуют держать в пределах 10 ГБ. Один push — не больше 2 ГБ10 ГиБ на проект, вместе с Git LFS. Один push — не больше 5 ГиБ. На платном тарифе предел проекта — 500 ГиБ
Git LFSфайл до 2 ГБ. В месяц входят 10 ГиБ хранения и 10 ГиБ скачиваний на аккаунт, а не на каждый репозиторий. Квота кончилась, а бюджет на перерасход нулевой — пользование LFS блокируют до следующего месяцаместо LFS входит в те же 10 ГиБ проекта. Сверх них проект становится только для чтения, пока размер не вернут в предел или не купят место
Вложение к выпускуобщий объём и трафик не ограничивают. Каждый файл — не больше предела LFS на тарифе, на бесплатном это 2 ГБв таблице настроек GitLab.com отдельный предел вложений к выпуску не назван. Файл, который не входит в 10 ГиБ проекта, в этот проект не кладут

МиБ и ГиБ — единицы из документации площадок: 1 МиБ = 1024 × 1024 байт. Страница квот GitLab.com пишет 10 ГиБ, таблица настроек того же сайта — «10 GB» для того же предела, размера репозитория вместе с LFS.

Git LFS — дополнение к Git. В истории остаётся короткая ссылка, сам файл лежит отдельно. Его ставят, когда файл должен приезжать вместе с клонированием и не влезает в обычный Git. Две оговорки. На GitHub Pages файлы LFS не отдают: страница, собранная из того же репозитория, большой файл не покажет. Квота скачиваний на бесплатном GitHub — 10 ГиБ в месяц на весь аккаунт. Популярный набор может исчерпать её, и чужой человек файл не получит.

Так устроен geoBoundaries: границы административных единиц лежат в Git LFS, это видно по файлу .gitattributes (папки releaseData и sourceData). Сайт и API — отдельные репозитории того же проекта. 14 октября 2026 года файл LICENSE называл лицензию CC BY 4.0, README рядом писал «CC BY 4.0 / ODbL», а карточка GitHub помечала лицензию как Other. Текст читают в файле, значок на карточке его не заменяет.

Для файла, который скачивают целиком раз в квартал, проще вложение к выпуску: на GitHub у него нет месячной квоты трафика. В репозитории тогда остаются README, описатель и адрес вложения. Ещё крупнее — облако, см. главу об облаке и хабах.

Площадка может сменить правила или стать неудобной в вашей стране. Копия выпуска в Zenodo эту зависимость уменьшает. На GitHub связка делает копию сама. На GitLab.com такой кнопки нет: архив выпуска загружают в Zenodo вручную или скриптом.

Почему репозиторий почти не ищут​

У репозитория нет признака «здесь данные». Для площадки он такой же, как репозиторий с кодом. В 2022 году поиск по имени файла, выполненный из учётной записи, находил на GitHub десятки миллионов CSV, JSON, XML и баз SQLite. Каталогом он от этого не становится.

14 октября 2026 года поиск по коду без токена ответил 401 и текстом «Requires authentication». Поиск репозиториев по темам при этом открыт. Тема — метка, которую автор ставит сам. В тот день поиск насчитал 19 595 репозиториев с темой dataset и 10 590 с темой open-data (поле incomplete_results было false). Это только те репозитории, где автор метку поставил.

Человек и программа отличают репозиторий с данными по косвенным признакам: текст README.md, файлы в корне, datapackage.json. Темы dataset и open-data всё равно стоит поставить: это бесплатно и помогает тем, кто ищет по темам. Страница с разметкой schema.org нужна отдельно. Без неё поисковик данных репозиторий почти не видит.

Выпуск и DOI​

Ссылка на файл в ветке main открывает сегодняшнее состояние. Завтра в той же ссылке будут другие строки. Выпуск фиксирует это состояние. На практике это метка версии, например v2026.1, и приложенный к ней архив. В отчёте ссылаются на выпуск, а не на ветку. Как устроены адрес и DOI, — в главе об идентификаторах.

На GitHub репозиторий связывают с Zenodo в профиле Zenodo. Связка забирает выпуски, созданные после включения, и каждому выдаёт DOI. У ряда выпусков есть и общий DOI: он открывает последнюю версию. В тексте цитируют DOI конкретного выпуска. Пока связки нет, из шаблона CITATION.cff убирают блок identifiers с пустым DOI, чтобы не цитировать несуществующий номер. DOI, который Zenodo выдал, вписывают в CITATION.cff уже на ветке — для кнопки на GitHub. Переписывать ради этого сам архив выпуска не нужно: на странице Zenodo номер и так виден, а новый выпуск стал бы новой версией.

В CITATION.cff для данных нужна строка type: dataset. Без неё GitHub оформит ссылку как ссылку на программу. Кнопка при этом читает именно CITATION.cff.

Запись Zenodo устроена отдельно. Документация связки лежит в разделе про программы, а поддерживаемый пример CITATION.cff помечен type: software. Если в корне есть .zenodo.json, Zenodo читает только его и CITATION.cff для записи игнорирует. Справка с этим правилом опубликована 30 января 2026 года. Для набора данных в .zenodo.json ставят upload_type со значением dataset и те же название, авторов и лицензию, что в CITATION.cff. Код лицензии пишут так, как его знает Zenodo: cc-by-4.0, а не строка SPDX CC-BY-4.0 из файла цитирования. Совпадает смысл лицензии, а не написание. Расхождение CC BY и CC BY-NC уже ломало публикацию без портала, пример — в главе «Когда портал не нужен».

{
"title": "Название набора данных",
"upload_type": "dataset",
"license": "cc-by-4.0",
"version": "2026.1",
"creators": [
{"name": "Фамилия, Имя", "affiliation": "Организация"}
]
}

После первого выпуска запись открывают и проверяют три вещи: тип — набор данных, лицензия совпадает с файлом LICENSE, DOI ведёт на этот выпуск. DOI нужен, если на данные ссылаются в тексте. Для внутренней таблицы его не заводят.

На GitLab автоматической связки нет. Метку и архив делают там же, файл загружают в Zenodo отдельным шагом и сверяют ту же тройку.

Форматы под тех, кто будет пользоваться​

В репозитории легко выложить несколько форматов одного и того же списка. От этого зависит, возьмут ли данные. Два репозитория со списком стран показывают разницу. Country Codes отдаёт один CSV и словарь колонок. Country List отдаёт тот же по смыслу список на многих языках и сразу в файлах, которые программа подключает без преобразования. 14 октября 2026 года в каталоге data/ru лежали одиннадцать файлов: CSV, JSON, YAML, XML, HTML, простой текст, XLIFF, PHP и три варианта SQL — MySQL, PostgreSQL и SQLite. README перечисляет те же форматы. У первого репозитория в тот день было 981 звёзд, у второго — 5 253.

Звёзды — не оценка лицензии. У Country List файл LICENSE — текст MIT, он говорит о программе. У Country Codes в описателе указано общественное достояние ODC-PDDL-1.0, а README просит проверить ограничения ISO на коды стран, из которых список собран. Человек, которому нужен файл для базы, смотрит на формат. Человек, который вставляет список в продукт, читает лицензию в файле.

Вывод прежний. Словарь колонок нужен, и его дополняют форматами, в которых данными пользуются. Сначала выясняют, кто эти люди. Аналитик ждёт CSV или Parquet, разработчик — JSON или SQL. Как выбрать формат и почему GitHub показывает таблицей только CSV и TSV не больше 512 КБ, — в главе о форматах.

Код сборки вместо данных​

Иногда публикуют не таблицу, а программу, которая её собирает. Так делают, когда источник выкладывает Excel, меняет файлы без предупреждения или не даёт прямой ссылки. Готовая таблица устареет при следующем обновлении, скрипт можно запустить снова.

В 2022 году так опубликовали сборщики реестров аккредитованных ИТ-компаний и отечественного ПО с сайта Минцифры России. 14 октября 2026 года в репозитории по-прежнему лежат описания сборки, а не сами наборы: в папке itregistry один файл datacrafter.yml, он указывает, откуда брать Excel и как назвать колонки. README репозитория — одна строка «Datacrafter examples».

Скрипт живёт, пока жив источник. Если ведомство уберёт файл или сменит адрес, код перестанет собирать таблицу, а копии у вас не останется. Поэтому рядом с кодом публикуют результат: выпуск с готовыми файлами или копию в Zenodo. Как сохранять данные, которые могут исчезнуть у источника, — в главе об архивации.

Совместная правка​

Правку принимают запросом на слияние. На GitHub он называется pull request, на GitLab — merge request: это предложение изменить файлы, которое второй человек смотрит до того, как оно попадёт в основную ветку. В открытом репозитории на бесплатном GitHub можно сделать одобрение обязательным и назначить проверяющих файлом CODEOWNERS, например на папку data/. На GitLab.com в бесплатном тарифе одобрение слияние не блокирует. Как устроены роли и чем тарифы отличаются, — в главе о доступе. История коммитов при этом и есть журнал изменений.

Большую таблицу в окне запроса не прочитать. GitHub показывает разницу по одному файлу до 500 КБ или 20 000 строк, весь запрос — до 1 МБ или 20 000 строк. Проверку тогда делает программа, которая сверяет CSV со словарём колонок:

frictionless validate datapackage.json

Команду ставят в автоматический прогон при каждом изменении. На GitHub это Actions. Что именно ловит такая проверка, — в главе о полноте метаданных.

Версии таблицы, а не файла​

Git сравнивает строки текста. Для таблицы на сотни тысяч строк этого мало: проверяющий хочет видеть, какие ячейки поменялись, а не два файла по 50 МБ.

Dolt — база данных с языком SQL, совместимая с MySQL, которую клонируют, ветвят, сливают и отправляют так же, как репозиторий Git. Публичные базы бесплатно хранит DoltHub. Правка проходит запросом на слияние, и разница показана по строкам и ячейкам. К истории можно обратиться обычным SQL: таблица dolt_log — журнал коммитов. DoltLab — та же площадка для установки у себя.

# Два последних коммита публичной базы, без входа
curl -s "https://www.dolthub.com/api/v1alpha1/dolthub/ip-to-country/master?q=SELECT%20commit_hash%2C%20committer%2C%20date%20FROM%20dolt_log%20LIMIT%202"

15 октября 2026 года ответ начинался с "query_execution_status":"Success". Ветка у этой базы называется master. По адресу с main сервер ответил «branch not found».

Это ступень между репозиторием и порталом. История правок как в Git, но для таблицы, которая уже не помещается в CSV на пару мегабайт. Риск тот же, что у любой площадки одного оператора: в 2022 году так закрылся каталог QRI с похожей идеей. Поэтому заранее проверяют, что базу вместе с историей можно забрать к себе командой dolt clone. Другие новшества того же ряда — в главе о передовых каталогах.

Пример: квартальная таблица двоих​

Контекст. Два сотрудника ведомства раз в квартал правят таблицу расходов. Файл — CSV около 2 МБ. Нужно видеть, кто поменял строку. Раз в год таблицу цитируют в отчёте. Национальный каталог эту организацию не собирает. Своего сервера и договора с DataCite нет.

Варианты. Свой портал. Файл только в Zenodo, без репозитория. Репозиторий с README и без словаря колонок. Репозиторий с datapackage.json, лицензией и страницей; годовой выпуск уходит в Zenodo.

Критерии. История правки видна без сервера. У колонок есть имена и типы. Годовой файл, на который ссылается отчёт, не меняется задним числом. Сопровождение укладывается в работу этих двух человек.

Решение. Репозиторий на GitHub или GitLab, файлы — по шаблонам книги. Страница собирается из того же репозитория. Раз в год ставят метку выпуска. На GitHub выпуск забирает Zenodo. На GitLab архив загружают в Zenodo сами. В обоих случаях у записи тип «набор данных».

Почему. Портал добавляет сервер, а публикаторов по-прежнему двое. Один Zenodo не показывает, кто поправил ячейку в марте. Репозиторий без datapackage.json оставляет таблицу без смысла полей. Ветка main не годится для сноски в отчёте: по той же ссылке в следующем квартале будут другие числа.

Последствия. DOI ведёт на копию выпуска в Zenodo. Ссылку «таблица на сегодня» дают на страницу, ссылку из отчёта — на DOI этого года. Файл больше предела в этот репозиторий не кладут. Лицензия в LICENSE, в описателе и в записи Zenodo одна и та же.

Когда пересмотреть. Файл упёрся в предупреждение площадки (на GitHub — с 50 МиБ) или в отказ. Разницу в запросе на слияние уже нельзя прочитать: тогда смотрят на Dolt. Появилась третья группа, которая не работает с Git. Национальный каталог начал требовать файл описаний: его кладут рядом, портал из-за этого ещё не обязателен. Годовой срез цитируют чаще, чем его выпускают.

Как проверить​

Проверка занимает несколько минут и не требует входа на площадку. Ожидаемые ответы ниже получены 14 октября 2026 года.

# Файл открывается без входа: код 200, длина 133966 байт
curl -sI "https://raw.githubusercontent.com/datasets/country-codes/main/data/country-codes.csv"

# Описатель на месте. У этого репозитория он в YAML, стандарт просит datapackage.json
curl -sI "https://raw.githubusercontent.com/datasets/country-codes/main/datapackage.yml"

# Поиск по содержимому файлов без токена закрыт
curl -s "https://api.github.com/search/code?q=filename:datapackage.json"

# Темы репозиториев видны без входа. Смотрят поле total_count
curl -s "https://api.github.com/search/repositories?q=topic:dataset&per_page=1"

Первые два ответа — код 200. Третий — код 401 и сообщение, что нужна аутентификация. В четвёртом в тот день total_count был 19 595. Поле last_modified в описателе Country Codes стоит 2023-09-25, а последний push репозитория на тот день — 1 октября 2026 года. Дату в описателе и дату файла сверяют оба: они уже разошлись.

Дальше открывают свой репозиторий. В корне пакета есть datapackage.json, LICENSE и CITATION.cff со строкой type: dataset и без пустого DOI. Файл, на который будут ссылаться, открывается по адресу метки выпуска, а не только по адресу ветки. Если включён Zenodo, у записи тип набора данных и та же лицензия, что в LICENSE.

Источники​