🔝 Retour au Sommaire
Imaginez que vous travaillez sur un jeu vidéo, une application de design, ou un projet de machine learning. Votre dépôt Git contient des images haute résolution, des vidéos, des modèles 3D ou des datasets de plusieurs gigaoctets. Vous faites un git clone et... vous attendez. Longtemps. Très longtemps. Et quand c'est enfin terminé, votre dossier .git fait 10 Go !
C'est là que Git LFS (Large File Storage) entre en jeu. C'est une extension de Git spécialement conçue pour gérer les gros fichiers de manière efficace.
Dans cette section, nous allons découvrir :
- Pourquoi Git n'est pas adapté aux gros fichiers par défaut
- Comment fonctionne Git LFS
- Comment l'installer et l'utiliser
- Quand l'utiliser (et quand ne pas l'utiliser)
- Les alternatives à Git LFS
Note pour les débutants : Si vous travaillez uniquement avec du code (fichiers texte, HTML, CSS, JavaScript, Python, etc.), vous n'aurez probablement jamais besoin de Git LFS. Mais si vous manipulez des images, vidéos, fichiers audio, modèles 3D, ou gros datasets, cette section est pour vous !
Git n'a pas été conçu pour les gros fichiers. Voici pourquoi :
Chaque version est conservée Quand vous modifiez un fichier et que vous faites un commit, Git conserve TOUTES les versions :
video.mp4 (version 1) - 500 Mo
video.mp4 (version 2) - 500 Mo ← légèrement modifiée
video.mp4 (version 3) - 500 Mo ← encore modifiée
Résultat : 1.5 Go dans votre dépôt pour un seul fichier !
Analogie : Imaginez que vous écrivez un livre. Avec Git, c'est comme si vous gardiez une photocopie complète du livre à chaque fois que vous changez un seul mot. Après 100 révisions, vous avez 100 copies complètes du livre !
Pour du code (fichiers texte), ce n'est pas un problème car :
- Les fichiers sont petits (quelques Ko)
- Git utilise des algorithmes de compression intelligents
- Git ne stocke que les différences (delta compression)
Mais pour une vidéo de 500 Mo, la compression ne peut pas faire de miracle.
1. Clonage très lent
git clone https://github.com/username/projet-avec-videos.git
# Téléchargement de 10 Go... ⏳⏳⏳
# Durée estimée : 2 heures2. Opérations Git lentes Chaque commande Git doit parcourir l'historique complet :
git status # Lent
git log # Lent
git diff # Très lent3. Espace disque énorme
Votre dossier .git devient gigantesque, même pour un petit projet.
4. Limites des plateformes
- GitHub limite les fichiers à 100 Mo
- GitLab limite les dépôts à quelques Go (plan gratuit)
- Votre réseau pleure quand vous faites un push
5. Versions inutiles
Vous avez besoin de la version actuelle de model.pth (modèle de machine learning), pas des 50 versions précédentes que vous avez testées pendant le développement !
Git LFS est une extension de Git qui change la façon dont les gros fichiers sont stockés.
L'idée principale : Au lieu de stocker les gros fichiers directement dans Git, on les stocke ailleurs (sur un serveur de stockage) et on met seulement un "pointeur" dans Git.
Analogie : C'est comme une bibliothèque :
- Sans LFS : Vous gardez tous les livres chez vous (encombrant, lourd)
- Avec LFS : Vous gardez seulement un catalogue avec les références des livres. Quand vous avez besoin d'un livre, vous allez le chercher à la bibliothèque.
Sans Git LFS :
Dépôt Git
├── code.js (10 Ko)
├── image.png (5 Mo) ← stockée directement
└── .git/
└── objects/
├── code.js (toutes versions)
└── image.png (toutes versions) ← Très lourd !
Avec Git LFS :
Dépôt Git
├── code.js (10 Ko)
├── image.png → pointeur (200 octets) ← juste une référence !
└── .git/
└── lfs/
└── objects/ ← fichiers LFS (téléchargés à la demande)
Serveur LFS distant
└── image.png (5 Mo) ← Le vrai fichier est ici
Le pointeur ressemble à ça :
version https://git-lfs.github.com/spec/v1
oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
size 5242880
C'est tout ! Juste 3 lignes au lieu de 5 Mo.
Clonage rapide
git clone https://github.com/username/projet-avec-videos.git
# Télécharge uniquement les pointeurs (quelques Ko)
# Les gros fichiers sont téléchargés seulement quand nécessaireHistorique léger
Votre .git reste petit. L'historique des gros fichiers est géré par LFS, pas par Git.
Versions à la demande Vous ne téléchargez que la version actuelle des gros fichiers, pas tout l'historique.
Gestion du bandwidth Vous pouvez choisir quels fichiers télécharger.
Option 1 : Installeur
- Téléchargez l'installeur depuis git-lfs.github.com
- Exécutez l'installeur
- Suivez les instructions
Option 2 : Git pour Windows Git LFS est souvent inclus avec Git pour Windows. Vérifiez :
git lfs versionSi c'est installé, vous verrez quelque chose comme :
git-lfs/3.4.0 (GitHub; windows amd64; go 1.21.0)
Avec Homebrew (recommandé) :
brew install git-lfsAvec MacPorts :
port install git-lfsUbuntu/Debian :
sudo apt-get install git-lfsFedora :
sudo dnf install git-lfsArch Linux :
sudo pacman -S git-lfsAprès l'installation, configurez Git LFS pour votre utilisateur :
git lfs installVous verrez :
Updated git hooks.
Git LFS initialized.
Cette commande configure les hooks Git nécessaires. Vous ne devez la faire qu'une seule fois par utilisateur (elle modifie votre configuration Git globale).
Vous créez un site web avec des photos haute résolution.
Étape 1 : Initialiser le dépôt Git
mkdir mon-portfolio
cd mon-portfolio
git initÉtape 2 : Configurer LFS pour suivre les images
git lfs track "*.png"
git lfs track "*.jpg"
git lfs track "*.jpeg"Cette commande dit à Git LFS : "Tous les fichiers .png, .jpg, .jpeg doivent être gérés par LFS."
Ce qui se passe :
Un fichier .gitattributes est créé :
*.png filter=lfs diff=lfs merge=lfs -text
*.jpg filter=lfs diff=lfs merge=lfs -text
*.jpeg filter=lfs diff=lfs merge=lfs -text
Important : Ce fichier .gitattributes doit être commité !
git add .gitattributes
git commit -m "Configure Git LFS pour les images"Étape 3 : Ajouter vos gros fichiers
# Ajouter des images
cp ~/Downloads/photo1.jpg images/
cp ~/Downloads/photo2.png images/
# Git LFS les gère automatiquement !
git add images/
git commit -m "Ajouter photos du portfolio"Étape 4 : Vérifier que LFS fonctionne
git lfs ls-filesVous devriez voir :
4d7a214614 * images/photo1.jpg
a8b3c52741 * images/photo2.png
L'astérisque * indique que le fichier est suivi par LFS !
Étape 5 : Pousser vers GitHub/GitLab
git remote add origin https://github.com/username/mon-portfolio.git
git push -u origin mainGit LFS pousse automatiquement les gros fichiers vers le serveur LFS !
Suivre par extension :
git lfs track "*.psd" # Fichiers Photoshop
git lfs track "*.mp4" # Vidéos
git lfs track "*.zip" # Archives
git lfs track "*.bin" # Fichiers binairesSuivre par dossier :
git lfs track "assets/videos/**" # Tous les fichiers dans assets/videos/
git lfs track "datasets/*.csv" # Tous les CSV dans datasets/Suivre un fichier spécifique :
git lfs track "model_final.pth" # Un fichier précisListe des patterns suivis :
git lfs trackAffiche :
Listing tracked patterns
*.png (.gitattributes)
*.jpg (.gitattributes)
*.psd (.gitattributes)
Listing excluded patterns
Liste des fichiers LFS dans le dépôt :
git lfs ls-filesgit lfs untrack "*.zip"Attention : Cela ne convertit pas les fichiers existants ! Ils restent dans LFS. Cette commande affecte seulement les futurs fichiers.
Télécharger tous les fichiers LFS :
git lfs pullTélécharger des fichiers spécifiques :
git lfs pull --include="images/*.jpg"Pré-télécharger avant un checkout :
git lfs fetch
git checkout autre-brancheVérifier l'installation :
git lfs versionVoir l'environnement LFS :
git lfs envAffiche la configuration, l'URL du serveur LFS, etc.
Statistiques :
git lfs statusVous avez déjà un dépôt avec de gros fichiers ? Vous pouvez les migrer vers LFS.
Votre dépôt existe déjà, et vous vous rendez compte que les vidéos ralentissent tout.
Étape 1 : Sauvegarder (important !)
# Créer une copie de sécurité
cp -r mon-projet mon-projet-backupÉtape 2 : Installer et configurer LFS
git lfs install
git lfs track "*.mp4"
git add .gitattributes
git commit -m "Configure LFS pour les vidéos"Étape 3 : Migrer l'historique
Option A : Migrer uniquement les futurs fichiers (simple)
Les fichiers déjà commités restent dans Git, mais les nouveaux seront dans LFS :
# Les vidéos existantes restent dans Git
# Les nouvelles vidéos iront dans LFSOption B : Migrer tout l'historique (avancé)
Attention, cela réécrit l'historique !
git lfs migrate import --include="*.mp4"Cette commande :
- Parcourt tout l'historique
- Convertit tous les
*.mp4en fichiers LFS - Réécrit les commits
Conséquences :
- Les hash des commits changent
- Vous devez forcer le push :
git push --force - Les collaborateurs doivent re-cloner le dépôt
Étape 4 : Vérifier
git lfs ls-filesÉtape 5 : Pousser (peut nécessiter --force)
git push origin main --forceLa migration complète (Option B) est dangereuse car elle réécrit l'historique. Ne le faites que si :
- Vous êtes seul sur le projet
- Ou vous coordonnez avec toute l'équipe
- Vous avez des sauvegardes
Pour un dépôt en production avec plusieurs développeurs, privilégiez l'Option A (futurs fichiers seulement).
Quand vous clonez un dépôt qui utilise LFS, deux options :
git clone https://github.com/username/projet.gitGit LFS télécharge automatiquement tous les fichiers LFS de la branche actuelle.
Si vous voulez cloner rapidement sans télécharger les gros fichiers :
GIT_LFS_SKIP_SMUDGE=1 git clone https://github.com/username/projet.gitLes fichiers LFS ne sont pas téléchargés. Vous voyez les pointeurs à la place.
Télécharger ensuite :
cd projet
git lfs pullOu télécharger seulement certains fichiers :
git lfs pull --include="images/*.jpg"1. Assets de jeux vidéo
- Textures (PNG, JPG)
- Modèles 3D (FBX, OBJ)
- Sons et musiques (WAV, MP3)
- Vidéos de cinématiques (MP4)
2. Design et médias
- Fichiers Photoshop (PSD)
- Fichiers Illustrator (AI)
- Fichiers vidéo (MP4, MOV)
- Fichiers audio (WAV, FLAC)
3. Machine Learning
- Modèles entraînés (
.pth,.h5,.pkl) - Datasets (gros CSV, images)
- Fichiers de poids (
.weights)
4. Documentation
- PDFs volumineux
- Vidéos de démonstration
- Images haute résolution
Règle générale : Si un fichier fait plus de 1-5 Mo et change rarement, considérez LFS.
1. Code source
- JavaScript, Python, HTML, CSS, etc.
- Fichiers de configuration
- README, documentation texte
2. Fichiers texte en général Git gère très bien les fichiers texte, même gros.
3. Fichiers qui changent constamment Si un gros fichier change à chaque commit, LFS n'aidera pas beaucoup. Le problème est la fréquence de changement, pas la taille.
4. Fichiers générés
- Bundles JavaScript (
dist/bundle.js) - Fichiers compilés
- Dépendances (
node_modules/)
Ces fichiers ne devraient pas être dans Git du tout (utilisez .gitignore).
Quota :
- 1 Go de stockage gratuit
- 1 Go de bandwidth par mois gratuit
- Au-delà : achat de "data packs" (5$ pour 50 Go)
Configuration : Aucune configuration spéciale. LFS fonctionne automatiquement.
Limites :
- 2 Go maximum par fichier
Quota :
- 10 Go de stockage gratuit (plan gratuit)
- Bandwidth inclus
Configuration : LFS activé par défaut sur GitLab.com
Limites :
- Limite de taille par fichier : configurable par l'administrateur
Quota :
- 1 Go de stockage gratuit
- 1 Go de bandwidth par mois gratuit
- Au-delà : forfaits payants
Configuration : LFS doit être activé dans les paramètres du dépôt.
Vous devez configurer le serveur LFS vous-même. Plusieurs options :
- Stockage local sur le serveur
- Stockage cloud (S3, Azure Blob, etc.)
Git LFS n'est pas la seule solution. Voici les alternatives :
Ce que c'est : Alternative à LFS, plus ancienne et plus flexible.
Avantages :
- Plus de contrôle sur où stocker les fichiers
- Peut gérer des fichiers sur plusieurs emplacements (S3, serveur local, disque externe)
- Pas de limitations de quota
Inconvénients :
- Plus complexe à utiliser
- Moins de support sur les plateformes (GitHub, GitLab)
Quand l'utiliser : Projets académiques ou scientifiques avec des besoins très spécifiques.
Ce que c'est : Outil conçu spécifiquement pour les projets de machine learning et data science.
Avantages :
- Gestion des datasets et modèles
- Pipelines de traitement de données
- Gestion des expériences ML
- Support de S3, Google Cloud Storage, Azure, etc.
Inconvénients :
- Outil séparé (pas intégré à Git)
- Courbe d'apprentissage
Quand l'utiliser : Projets de machine learning avec de gros datasets et modèles.
Exemple :
# Initialiser DVC
dvc init
# Suivre un gros fichier
dvc add dataset.csv
# Pousser vers le stockage distant
dvc pushOption : Stockage externe Parfois, la meilleure solution est de ne PAS versionner les gros fichiers :
- Télécharger depuis une URL publique
- Utiliser un service de stockage (Dropbox, Google Drive)
- Générer les fichiers localement (si possible)
Exemple avec un script de téléchargement :
# download_assets.sh
#!/bin/bash
echo "Téléchargement des assets..."
curl -o images/banner.jpg https://example.com/assets/banner.jpg
curl -o models/model.pth https://example.com/models/model.pth
echo "Téléchargement terminé !"README.md :
## Installation
1. Cloner le dépôt
2. Exécuter `./download_assets.sh`
3. Lancer l'applicationNe migrez pas vers LFS au milieu d'un projet avec beaucoup d'historique. Commencez avec LFS si vous savez que vous aurez de gros fichiers.
Le fichier .gitattributes doit être versionné :
git add .gitattributes
git commit -m "Configure Git LFS"Sans ce fichier, les autres contributeurs ne sauront pas quels fichiers sont gérés par LFS.
Dans votre README :
## Prérequis
Ce projet utilise Git LFS pour les gros fichiers.
### Installation de Git LFS
- macOS: `brew install git-lfs`
- Windows: Télécharger depuis git-lfs.github.com
- Linux: `sudo apt-get install git-lfs`
### Après le clone
```bash
git lfs install
git lfs pull
#### 4. Surveiller vos quotas
Les plateformes ont des limites de stockage et bandwidth. Surveillez votre utilisation :
**GitHub :**
Settings → Billing → Git LFS Data
**GitLab :**
Settings → Usage Quotas
#### 5. Exclure les fichiers générés
Ne mettez pas dans LFS des fichiers qui peuvent être régénérés :
```bash
# ❌ Ne faites pas ça
git lfs track "dist/*.js" # Fichiers de build
# ✅ Mettez-les dans .gitignore
echo "dist/" >> .gitignore
Créez un fichier .lfsconfig pour partager la configuration :
[lfs]
url = https://lfs.example.com/project.git/info/lfsCommitez ce fichier pour que toute l'équipe utilise la même configuration.
Supprimez les anciens objets LFS dont vous n'avez plus besoin :
git lfs pruneCela supprime les fichiers LFS qui ne sont plus référencés par aucun commit récent.
Symptômes :
git-lfs filter-process: git-lfs: command not found
error: external filter 'git-lfs filter-process' failed
Solution : Installez Git LFS et configurez-le :
# Installer (selon votre OS)
brew install git-lfs # macOS
sudo apt-get install git-lfs # Ubuntu
# Configurer
git lfs installSymptômes : Vous voyez le contenu du pointeur au lieu du fichier :
version https://git-lfs.github.com/spec/v1
oid sha256:4d7a...
size 5242880
Solution :
# Télécharger les fichiers LFS
git lfs pull
# Ou réinstaller les hooks
git lfs install --forceSymptômes :
Remote "origin" does not support the LFS locking API. Consider disabling it with:
$ git config lfs.https://github.com/user/repo.git/info/lfs.locksverify false
batch response: This repository is over its data quota...
Solution : Vous avez dépassé le quota de votre plan. Options :
- Acheter plus d'espace
- Supprimer d'anciens fichiers LFS
- Nettoyer avec
git lfs prune
Symptômes : Le push semble bloqué sur "Uploading LFS objects"
Solutions :
- Vérifier votre connexion Internet
- Utiliser un réseau plus rapide
- Pousser en plusieurs fois :
# Pousser seulement les objets Git
git push origin main --no-verify
# Pousser les objets LFS séparément
git lfs push origin mainSymptômes :
remote: error: File model.bin is 2.50 GB; this exceeds GitHub's file size limit of 2.00 GB
Solutions :
- Compresser le fichier
- Diviser le fichier en plusieurs parties
- Utiliser un service de stockage externe (S3, Google Drive)
- Utiliser DVC au lieu de LFS
git log --follow -- path/to/file.jpg# Impossible de voir le diff d'un fichier binaire
# Mais vous pouvez voir les métadonnées
git log -p -- path/to/file.jpg# Télécharger toutes les versions
git lfs fetch --allgit lfs ls-files -l | sort -k3 -n -r | head -10Affiche les 10 plus gros fichiers LFS.
git lfs push origin main --include="images/*.jpg"Plan gratuit :
- 1 Go de stockage LFS
- 1 Go de bandwidth par mois
Data packs :
- 50 Go de stockage + 50 Go de bandwidth : 5$/mois
- Multipliable (10 data packs = 500 Go pour 50$/mois)
Calcul du coût :
Exemple : 100 images de 2 Mo chacune
Stockage : 200 Mo (OK pour le plan gratuit)
5 contributeurs clonent le dépôt par mois
Bandwidth : 5 × 200 Mo = 1 Go (OK pour le plan gratuit)
10 contributeurs clonent le dépôt
Bandwidth : 2 Go (nécessite 1 data pack : 5$/mois)
GitLab :
- 10 Go gratuits (10x plus que GitHub)
- Meilleure option pour les projets open-source avec beaucoup de médias
Auto-hébergement :
- Serveur GitLab + stockage S3
- Coût uniquement du serveur et du stockage
- Contrôle total
- Git LFS : git-lfs.github.com
- GitHub et LFS : docs.github.com/en/repositories/working-with-files/managing-large-files
- GitLab et LFS : docs.gitlab.com/ee/topics/git/lfs/
- Atlassian Git LFS Tutorial : atlassian.com/git/tutorials/git-lfs
- GitHub Guide : git-lfs.github.com
- BFG Repo-Cleaner : Nettoyer l'historique (reclaimator.org)
- git-filter-repo : Alternative à BFG (github.com/newren/git-filter-repo)
Git LFS est un outil puissant pour gérer les gros fichiers binaires dans Git. Il résout élégamment le problème des fichiers volumineux qui ralentissent et encombrent votre dépôt.
Points clés à retenir :
✅ Git seul n'est pas adapté aux gros fichiers - Chaque version est conservée, ce qui fait exploser la taille du dépôt
✅ LFS utilise des pointeurs - Les gros fichiers sont stockés séparément, seule une référence est dans Git
✅ Installation simple - brew install git-lfs puis git lfs install
✅ Configuration facile - git lfs track "*.psd" pour commencer à suivre des fichiers
✅ Transparence - Une fois configuré, LFS fonctionne automatiquement avec vos commandes Git habituelles
✅ Quotas à surveiller - Les plateformes ont des limites de stockage et bandwidth
✅ Alternatives existent - DVC pour ML, Git Annex pour des besoins spécifiques, ou stockage externe
Recommandations finales :
- Petits projets avec quelques images : LFS est parfait
- Jeux vidéo / Design : LFS est indispensable
- Machine Learning : Considérez DVC en plus de LFS
- Fichiers énormes (>2 Go) : Stockage externe + script de téléchargement
Git LFS n'est pas magique - il ne rend pas les gros fichiers petits - mais il permet de les gérer intelligemment sans compromettre l'efficacité de Git pour le reste de votre projet.
Avec ces connaissances, vous êtes équipé pour gérer n'importe quel type de fichier dans vos projets Git, des simples fichiers texte aux datasets de plusieurs gigaoctets !