Git avance¶
LFS, monorepo, submodules et sparse checkout — gérer la complexité à l'échelle.
Git LFS — fichiers volumineux¶
Git est conçu pour du texte. Les fichiers binaires (images, modèles ML, datasets, videos) gonflent le repository et ralentissent le clone.
Git LFS (Large File Storage) remplacé les fichiers volumineux par des pointeurs dans le repo, et stocke le contenu réel sur un serveur séparé.
graph LR
A["git add image.png"] --> B["LFS intercepte"]
B --> C["Pointeur dans le repo<br/>(130 octets)"]
B --> D["Fichier reel sur<br/>le serveur LFS"]
E["git checkout"] --> F["LFS telecharge<br/>le fichier reel"] Installation et configuration¶
# Installer Git LFS
git lfs install
# Tracker les types de fichiers
git lfs track "*.png"
git lfs track "*.psd"
git lfs track "*.zip"
git lfs track "models/**"
# Le fichier .gitattributes est cree automatiquement
cat .gitattributes
# *.png filter=lfs diff=lfs merge=lfs -text
# *.psd filter=lfs diff=lfs merge=lfs -text
Bonnes pratiques¶
| Pratique | Raison |
|---|---|
| Tracker par extension et non par fichier | Attrape les nouveaux fichiers automatiquement |
Committer .gitattributes en premier | Les coequipiers ont la config des le premier clone |
| Limiter les fichiers > 5 Mo | Seuil raisonnable entre convenance et performance |
LFS et CI
Votre pipeline CI doit supporter LFS (git lfs pull). Certains runners CI ne l'installent pas par défaut — verifiez.
Monorepo vs Polyrepo¶
Le choix fondamental¶
| Critère | Monorepo | Polyrepo |
|---|---|---|
| Tous les projets dans | Un seul repository | Chacun son repository |
| Refactoring transverse | Facile — un seul commit | Difficile — coordonner N repos |
| CI/CD | Complexe — détecter ce qui a change | Simple — un pipeline par repo |
| Permissions | Difficile — tout le monde voit tout | Facile — accès par repo |
| Dépendances internes | Toujours à jour | Versionnes explicitement |
graph TD
subgraph "Monorepo"
MR["repo/"]
MR --> A["apps/frontend"]
MR --> B["apps/backend"]
MR --> C["libs/shared"]
MR --> D["infra/terraform"]
end
subgraph "Polyrepo"
PR1["frontend-repo/"]
PR2["backend-repo/"]
PR3["shared-lib-repo/"]
PR4["infra-repo/"]
end Quand choisir quoi¶
- Monorepo : équipe unique, projets fortement couples, refactoring frequent
- Polyrepo : équipes indépendantes, projets decouples, besoin de permissions fines
Outils monorepo¶
| Outil | Écosystème | Fonctionnalités |
|---|---|---|
| Nx | JS/TS | Graphe de dépendances, cache, affected commands |
| Turborepo | JS/TS | Cache distribué, parallélisme, simple à configurer |
| Bazel | Multi | Build hermetique, cache, scale Google |
| Pants | Python | Build system moderne, détection des changements |
Git submodules¶
Les submodules incluent un repository Git à l'intérieur d'un autre, a un commit fixe.
# Ajouter un submodule
git submodule add https://forge.example.com/libs/common.git libs/common
# Cloner un repo avec submodules
git clone --recurse-submodules https://forge.example.com/project.git
# Mettre a jour les submodules
git submodule update --remote
Quand utiliser les submodules¶
| Cas d'usage | Submodule adapté ? |
|---|---|
| Dépendance externe versionee | Oui |
| Code partage entre équipes avec cycles différents | Oui |
| Monorepo avec projets fortement couples | Non — preferez un monorepo pur |
La complexité des submodules
Les submodules sont notoirement difficiles a gérer. Chaque git pull doit être suivi d'un git submodule update. Les développeurs oublient, le code se desynchronise. Evaluez si un package manager (npm, pip, Maven) ne serait pas plus simple.
Sparse checkout¶
Le sparse checkout permet de ne cloner qu'un sous-ensemble du repository. Utile dans les monorepos massifs ou vous ne travaillez que sur un projet.
# Clone partiel (sans les fichiers)
git clone --filter=blob:none --sparse https://forge.example.com/monorepo.git
cd monorepo
# Ajouter les dossiers qui vous interessent
git sparse-checkout set apps/frontend libs/shared
# Verifier ce qui est checkoute
git sparse-checkout list
graph TD
R["monorepo (complet)"]
R --> A["apps/frontend ✓"]
R --> B["apps/backend ✗"]
R --> C["libs/shared ✓"]
R --> D["infra/ ✗"]
style A fill:#c8e6c9
style C fill:#c8e6c9
style B fill:#ffcdd2
style D fill:#ffcdd2 Avantages¶
- Clone rapide même sur un repo de 10+ Go
- Working directory propre — seuls vos fichiers
- Compatible avec toutes les opérations Git normales
Outils¶
| Outil | Description | Lien |
|---|---|---|
| Git LFS | Stockage de fichiers volumineux hors du repo | git-lfs.com |
| Nx | Build system et monorepo JS/TS | nx.dev |
| Turborepo | Build system monorepo rapide et simple | turbo.build |
| Bazel | Build system hermetique multi-langage | bazel.build |
| git submodule | Inclure un repo dans un autre | Inclus avec Git |
| git sparse-checkout | Cloner un sous-ensemble du repo | Inclus avec Git |