Git LFS и большие файлы в репозиториях
Коротко: Git создан для исходного кода; большие двоичные файлы, такие как видео или модели, раздувают репозитории, а Git LFS выносит их и хранит в репозитории только указатели.
Подробнее: Git постоянно хранит каждую версию каждого файла. Файл на 100 МБ, изменённый десять раз, быстро занимает гигабайт, а каждый клон скачивает всю историю. Платформы ограничивают размеры файлов (например, GitHub: предупреждение от 50 МБ, блокировка от 100 МБ на файл).
Подробности
Проблема
Большие двоичные файлы (изображения высокого разрешения, видео, аудио, игровые ресурсы, базы данных, модели ИИ, файлы дизайна) трудно сравнивать и сжимать. Репозиторий становится большим и медленным (клонирование, checkout), запуски CI длятся дольше. Даже случайно закоммиченные большие файлы остаются в истории, даже если их позже удалить.
Git LFS (Large File Storage)
git lfs install
git lfs track "*.psd" "*.mp4" "models/*.bin" # задать шаблоны
git add .gitattributes
git add model.bin
git commit -m "Add model"
git pushВ репозитории лежит лишь небольшой указатель с хешем и размером; настоящий файл лежит на сервере LFS и скачивается при checkout. Преимущества: компактная история, более быстрое клонирование, файлы только по необходимости (git lfs pull, GIT_LFS_SKIP_SMUDGE=1). Недостатки: дополнительный инструмент, квоты/расходы у провайдеров, более сложная очистка.
Альтернативы
- Вообще не класть большие файлы в Git: хранение в объектном хранилище (S3, облачное хранилище) или в артефактах релизов и только ссылка/скрипт загрузки.
- DVC (Data Version Control) и Hugging Face Hub для данных и моделей ИИ.
- Git-Annex для очень больших наборов данных.
- Perforce/Plastic SCM для игровых студий с огромными ресурсами.
- Частичные клоны и sparse checkout (
git clone --filter=blob:none) сокращают данные при клонировании.
Очистка и предотвращение
.gitignore для результатов сборки, зависимостей (node_modules), больших тестовых данных. Для уже добавленных гигантских файлов: очистить историю с помощью git filter-repo или BFG Repo-Cleaner (история переписывается: сообщите команде, все клонируют заново). Проверить размер: git count-objects -vH, git rev-list --objects --all | …. Хук pre-commit против больших файлов (check-added-large-files).
См. также: gitignore и подмодули, Git hooks, Git