Aller au contenu

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