EMZETT.
Войти

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