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