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