Как правильно хранить тяжёлые файлы в гит-репах? Например, бинарники или что-то подобное.

Ответ очевидный и правильный — никак! В гитлабах, гитхабах и битбакетах установлены лимиты на размер отдельных файлов. Там что-то вроде 50 метров на файл даётся.

В принципе можно уложиться. Но нахуй надо. Прикинь: у тебя пайплайн вытягивает репу размером с 10 гигабайт. И так каждую сборку. Гит-репа должна быть тощей и дрищёвой.

А всё тяжёлое будь бобр-добр храни в S3 либо на других решениях.

Но если очень хочется прям в гите держать, для этого существует Git LFS. Дословно — Large File Storage (дохуя большое файловое хранилище).

У LFS уже свои лимиты, в отличие от нативного Git-репозитория. И этот LFS включён из коробки в гитлабах, гитхабах и битбакетах. Там уже размер файла может быть 1 гигабайт или что-то вроде того.

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Гит-репа должна быть тощей и дрищёвой.

В Gitea тоже можно LFS через конфиг включить:

[server]
LFS_START_SERVER = true
LFS_ALLOW_PURE_SSH = true

[lfs]
PATH = /home/gitea/data/lfs

Как этим пользоваться?

Ставим к себе на машину:

apt-get install git-lfs
brew install git-lfs

Переходим в свой Git-репозиторий и инициализируем:

cd /home/user/linuxfactory/infra
git lfs install

В папке /infra/roles/node_exporter/files у меня лежит бинарник node_exporter, который весит 100 мегабайт.

На самом деле я хуй знает, сколько он весит, это для примера.

Помечаем его:

cd /infra/roles/node_exporter/files
git lfs track "node_exporter"

После этого в папке files появится файл .gitattributes. Это правила для этого файла, которые указывают, чтобы node_exporter улетал в LFS.

Внутри этот файл выглядит так:

node_exporter filter=lfs diff=lfs merge=lfs -text

И по итогу бинарник в репе станет ссылкой на настоящий бинарник в LFS.

А ещё можно вайлдкардами трекать:

git lfs track "*.jpg"

Ну а дальше, как обычно:

git add .
git commit -m "add lfs for node_exporter"
git push

Всё! Теперь твой большой файл аккуратно лежит в LFS, а в самом Git-репозитории осталась лишь ссылка, которая на этот файл ссылается.

Мне тут пришлось партнёрских постов на эту неделю понабрать, реинвестируем в развитие @gitgate, так что рекомендую включить баннерную слепоту и сильно не триггериться. Спасибо за понимание!

Чтиво: про LFS можешь глянуть ещё тут и тут.