Git LFS для геймдева: когда включать, как настроить и как не сломать репозиторий
Итак, Дмитрий Яковлев, спасибо за идею!
Частый сценарий: репозиторий пухнет, клон тормозит, история забита бинарниками. Git LFS решает это, если включить вовремя и не тащить туда всё подряд.
Ниже — что отдавать в LFS, как стартовать за час и как аккуратно мигрировать на следующей неделе.
TL;DR
- Когда нужен. У вас есть крупные бинарные ассеты (FBX, WAV/OGG, у UE — *.uasset/*.umap, у DCC — *.blend, *.spp, *.psd и т. п.), и они часто меняются.
- Что делать. Поставьте LFS, отметьте шаблоны файлов, добавьте лёгкую проверку перед коммитом, зафиксируйте правила в README.
- Важно запомнить. LFS хранится и тарифицируется отдельно (хостинг/трафик). Миграция задним числом переписывает историю — делаем это осознанно, в «замороженное» окно.
- Это не свалка. Не тащите в LFS всё подряд. Ориентир — порог размера (например, ≥ 5–10 МБ) и/или «по типу» (все игровые бинарники UE/Unity, исходники DCC).
Зачем нам LFS
Обычный Git хранит большие бинарники полными копиями на каждое изменение.
LFS же выносит содержимое в отдельное хранилище и оставляет в истории маленький указатель.
Результат: быстрее clone/fetch, чистая история, видимые квоты и понятный контроль расхода.
Командные бонусы: быстрее онбординг, меньше падений CI на скачивании, прозрачные отчёты о том, кто съел место в хранилище.
Что отдавать в LFS (а что — нет)
- Суём в LFS: UE (*.uasset, .umap), 3D (.fbx, *.glb, *.blend, .abc), большие текстуры (.tga, *.exr, крупные .png), исходники графики (.psd, *.psb, *.spp, .sbsar), аудио/видео (.wav, *.ogg, .mp4), тяжёлые инструменты (.ztl, *.hip).
- Оставляем в Git: код и конфиги (*.cs, *.cpp, *.uplugin, *.ini, *.json, *.yaml), мелкие изображения/иконки, скрипты и документация.
Простой тест: файл бинарный и часто меняется? Почти наверняка лучше кинуть в LFS.
Старт за 1 час
Цель — подключить LFS для всех новых изменений.
Установить LFS локально и на CI:
Отметить типы (пример — под UE/DCC, адаптируйте под стек):
Добавить лёгкую проверку перед коммитом (это будет скорее подсказка, а не запрет).
Смысл: Если бинарник >N-го количества МБ не в LFS — предложить git lfs track.
Зафиксировать правила в README: что в LFS/не в LFS, где смотреть квоты, что делать при ошибке «недостаточно трафика/хранилища».
Важно: это не чистит старую историю — мы просто перестаём её раздувать.
Миграция за неделю
Нужно, если история уже раздутa и клон медленный.
Краткий экспресс-план:
- Сделать зеркало/бэкап. Согласовать «freeze» (никто не пушит).
- Уточнить список шаблонов для LFS.
- прогнать миграцию (на GitHub/GitLab есть штатные инструменты; из CLI подойдёт git filter-repo):
- Проверить: чистый клон → сборка проекта.
- Сделать force-push (если требуется) и разослать короткую инструкцию коллегам: «переклонируйте/перефетчьте, почистите кэши».
Риски и что с ними делать: открытые PR/форки потребуют обновления; на некоторых платформах лимиты LFS по трафику/хранилищу — планируйте окно и квоты.
Типичные грабли и как на них не наступить
- Квота LFS кончилась. Найти «тяжёлых заливальщиков» по отчётам хостинга; временные артефакты хранить в артефактах CI/релизах, не в LFS.
- Пуш не проходит. Чаще всего трафиковый лимит — перенесите окно загрузок, дробите пакеты.
- Залили огромный файл мимо LFS. Добавить тип в track, перезалить; если уже в main — маленькое окно на правку истории.
- Конфликты в бинарниках. Включить file-locking для спорных типов (*.uasset и т. п.).
Мини-политика проекта (пара абзацев вместо талмуда)
В LFS: все UE-бинарники, FBX/GLB/BLEND, TGA/EXR и PNG > N-го кол-ва МБ, аудио/видео, исходники DCC.
В Git: код, конфиги, мелкие изображения, скрипты, доки. Порог N=5–10 МБ.
Артефакты билдов — в хранилище CI/релизов. Для конфликтных бинарников используем locking. Раз в неделю смотрим дашборд квот.
Короткий FAQ (сори за мат)
LFS бесплатен?
Базово — да, но хранилище и трафик на популярных платформах лимитируются. Проверяйте тариф/квоты заранее.
Нужно ли тащить в LFS все PNG?
Нет. Ставьте порог по размеру (например, ≥ 5–10 МБ) и/или ограничивайте типами, которые точно тяжелые (*.tga, *.exr, исходники *.psd, *.spp).
UE-проект целиком в Git — что делать?
Практика — отправлять все *.uasset/*.umap в LFS. Плюс крупные внешние источники (аудио/видео).
Мы уже раздулись — поздно ли чинить?
Никогда не поздно. Сначала перестаём усугублять, потом мигрируем историю в согласованное окно.
Итог
Git LFS — это не «магия», а дисциплина: правильно отметить типы, не хранить артефакты билдов в LFS, держать порог по размеру и один раз аккуратно переписать историю. На выходе — предсказуемый репозиторий: быстрее клон, чище история, прозрачные квоты.
Всем добра!