Git LFS ve depolardaki büyük dosyalar
Kısaca: Git kaynak kod için yapılmıştır; videolar veya modeller gibi büyük ikili dosyalar depoları şişirir ve Git LFS onları dışarı taşıyıp depoda yalnızca işaretçileri saklar.
Biraz daha ayrıntılı: Git, her dosyanın her sürümünü kalıcı olarak saklar. On kez değiştirilen 100 MB’lık bir dosya hızla bir gigabayt tutar ve her klon tüm geçmişi indirir. Platformlar dosya boyutlarını sınırlar (örneğin GitHub: 50 MB’tan uyarı, dosya başına 100 MB’tan engelleme).
Ayrıntılı
Sorun
Büyük ikili dosyaların (yüksek çözünürlüklü görüntüler, videolar, ses, oyun varlıkları, veritabanları, yapay zekâ modelleri, tasarım dosyaları) fark alınması ve sıkıştırılması zordur. Depo büyür ve yavaşlar (klonlama, checkout), CI çalıştırmaları uzar. Yanlışlıkla işlenen büyük dosyalar bile sonradan silinse geçmişte kalır.
Git LFS (Large File Storage)
git lfs install
git lfs track "*.psd" "*.mp4" "models/*.bin" # kalıpları belirle
git add .gitattributes
git add model.bin
git commit -m "Add model"
git pushDepoda yalnızca özet ve boyut içeren küçük bir işaretçi durur; gerçek dosya bir LFS sunucusunda durur ve checkout’ta indirilir. Avantajlar: yalın geçmiş, daha hızlı klonlama, dosyalar yalnızca gerektiğinde (git lfs pull, GIT_LFS_SKIP_SMUDGE=1). Dezavantajlar: ek araç, sağlayıcılarda kotalar/maliyetler, daha zor temizlik.
Alternatifler
- Büyük dosyaları hiç Git’e koymamak: nesne depolamada (S3, bulut depolama) veya sürüm çıktılarında (release artifacts) depolama ve yalnızca bir başvuru/indirme betiği.
- Veri ve yapay zekâ modelleri için DVC (Data Version Control) ve Hugging Face Hub.
- Çok büyük veri kümeleri için Git-Annex.
- Devasa varlıkları olan oyun stüdyoları için Perforce/Plastic SCM.
- Kısmi klonlar ve seyrek checkout (
git clone --filter=blob:none) klonlarken veriyi azaltır.
Temizlemek ve önlemek
Derleme çıktıları, bağımlılıklar (node_modules), büyük test verileri için .gitignore. Zaten eklenmiş dev dosyalar için: geçmişi git filter-repo veya BFG Repo-Cleaner ile temizleyin (geçmiş yeniden yazılır: ekibi bilgilendirin, herkes yeniden klonlar). Boyutu denetleyin: git count-objects -vH, git rev-list --objects --all | …. Büyük dosyalara karşı pre-commit hook’u (check-added-large-files).
Ayrıca bak: gitignore ve alt modüller, Git hook’ları, Git