Проблема: Git погано працює з великими бінарними файлами - макетами, відео, датасетами, моделями. Їх неможливо ефективно стиснути дельтами, кожна зміна додає повну нову копію, і кожен клон завантажує всі версії за всю історію.
Git LFS (Large File Storage) - розширення, яке зберігає великі файли окремо від репозиторію. У самому Git лишається лише маленький файл-вказівник:
version https://git-lfs.github.com/spec/v1
oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
size 52428800
А вміст файлу лежить на LFS-сервері (GitHub, GitLab, Bitbucket мають його вбудованим) і завантажується лише для потрібних версій при checkout.
Налаштування:
git lfs install # один раз на машині
git lfs track "*.psd" "*.mp4" # які файли зберігати в LFS
git add .gitattributes # правила записуються сюди
git add design/landing.psd
git commit -m "Add landing mockup"
# .gitattributes
*.psd filter=lfs diff=lfs merge=lfs -text
*.mp4 filter=lfs diff=lfs merge=lfs -text
Коли LFS доречний:
- дизайн-файли, медіа, ігрові ресурси, які справді є частиною проєкту і мають версії;
- тестові фікстури великого розміру;
- великі файли, які мають змінюватися разом з кодом.
Коли не потрібен:
- завантаження користувачів, бекапи, дампи - їм місце в об'єктному сховищі (S3, R2), а не в репозиторії взагалі;
- результати збирання - їх відтворює CI;
- невеликі зображення для сайту - звичайний Git впорається.
Що враховувати:
- квоти: хостинги обмежують обсяг зберігання й трафік LFS, а кожен клон у CI витрачає трафік;
- усі учасники мають встановити LFS - без нього в робочому каталозі будуть вказівники замість файлів;
- перенести існуючі файли в LFS - це переписування історії:
git lfs migrate import --include="*.psd"; - блокування файлів (
git lfs lock) - для форматів, які неможливо злити, щоб двоє не редагували один макет одночасно.