Pourquoi et comment utiliser les sous-modules Git
Posté le 2 juillet 2025 • 7 min de lecture • 1 457 motsLes sous-modules Git permettent de gérer proprement des dépendances entre dépôts. Apprenez à les utiliser efficacement dans vos projets d'infrastructure.

Les sous-modules Git sont une fonctionnalité native qui permet d’inclure un dépôt Git à l’intérieur d’un autre. Cette approche est utile lorsqu’il faut gérer des dépendances entre différents codebases, tout en conservant leur autonomie.
Les sous-modules pointent vers une révision précise d’un dépôt externe. Cela garantit que chaque version du projet principal utilise exactement la même version de ses sous-modules, assurant ainsi cohérence et reproductibilité.
Les sous-modules servent à composer un projet à partir de plusieurs dépôts, chacun pouvant évoluer indépendamment tout en étant contrôlé dans un ensemble cohérent.
Lorsque vous travaillez sur des projets complexes, il est fréquent d’avoir besoin d’inclure d’autres projets Git comme dépendances. Git propose une fonctionnalité appelée sous-modules qui permet d’intégrer un dépôt Git à l’intérieur d’un autre. Cela peut être très utile pour gérer des bibliothèques partagées, des composants réutilisables ou tout autre code externe.
Pour ajouter un sous-module à votre projet, utilisez la commande suivante :
git submodule add <url-du-dépôt> <chemin/dans/le/projet>Par exemple :
git submodule add https://github.com/mon-compte/ma-bibliotheque.git libs/ma-bibliothequeCette commande va :
libs/ma-bibliotheque..gitmodules qui décrit le sous-module.N’oubliez pas de committer ces changements :
git commit -am "Ajout du sous-module ma-bibliotheque"Lorsque vous clonez un projet qui contient des sous-modules, vous devez initialiser et récupérer les sous-modules séparément :
git clone <url-du-projet>
git submodule init
git submodule updateOu plus simplement :
git clone --recurse-submodules <url-du-projet>Pour mettre à jour un sous-module vers la dernière version de sa branche principale (par exemple main), vous pouvez :
cd <chemin/du/sous-module>
git checkout main
git pull
cd ../
git add <chemin/du/sous-module>
git commit -m "Mise à jour du sous-module"Important : il faut toujours committer dans le projet parent après modification d’un sous-module, car celui-ci suit un SHA-1 spécifique, et non une branche.
Pour supprimer un sous-module, il faut :
.gitmodules..git/config.Voici les commandes correspondantes :
git submodule deinit -f <chemin/du/sous-module>
rm -rf .git/modules/<chemin/du/sous-module>
git rm -f <chemin/du/sous-module>
git commit -m "Suppression du sous-module"Les sous-modules Git sont un outil puissant pour gérer des dépendances dans vos projets. Ils permettent de garder un contrôle précis sur les versions utilisées et facilitent la modularité du code. Cependant, ils nécessitent une certaine discipline dans leur gestion pour éviter les conflits et les problèmes de synchronisation.
N’hésitez pas à les utiliser lorsque vous avez besoin d’inclure des projets externes tout en gardant une gestion propre et claire de votre code.
Bien connaître les cas d’usage est essentiel pour éviter de se heurter à la complexité inutilement.
| Cas d’usage | Pourquoi les sous-modules sont adaptés |
|---|---|
| Bibliothèques partagées entre projets | Permet de fixer une version spécifique par projet |
| Composants d’infrastructure (ex : Terraform, CDK) | Réutilisation avec contrôle de version |
| Plugins externes dans des dépôts dédiés | Intégration stricte avec le code principal |
| Projets avec cycles de release distincts | Isolation et indépendance de mise à jour |
Résumé : Les sous-modules sont idéaux quand il faut intégrer de manière stricte des composants maintenus séparément, sans perte de contrôle sur leurs versions.
Quelques bonnes pratiques à connaître :
git submodule update --init --recursive après un cloneREADME.md--depth=1)git submodule foreach git pull origin mainPermet de mettre à jour tous les sous-modules en une seule commande.
.gitmodules| Fonctionnalité | Submodule | Subtree | Gestionnaire de paquets |
|---|---|---|---|
| Historique Git séparé | ✅ | ✅ | ❌ |
| Suivi de commit spécifique | ✅ | ✅ | ❌ |
| Simplicité de configuration | ❌ | ✅ | ✅ |
| Adapté à l’infrastructure | ✅ | ✅ | ❌ |
Se contenter d’un simple :
git clone <repo>Symptôme : Les dossiers des submodules apparaissent vides ou incomplets.
Solution :
Toujours cloner avec :
git clone --recurse-submodulesOu après coup :
git submodule update --init --recursiveAller dans un submodule, faire un ‘git pull’, puis oublier de committer le changement dans le projet principal.
Symptôme :
Solution : Après mise à jour :
git add path/to/submodule
git commit -m "Update submodule"Git ne pointe pas vers une branche mais vers un commit précis → il faut commit l’update.
Par défaut, lorsqu’on initialise un submodule, Git le place dans un état “detached HEAD”.
Symptôme :
Solution : Toujours vérifier la branche :
git checkout mainSouvent, un développeur modifie un submodule… en pensant qu’il modifie le projet principal.
Symptômes :
Bonne pratique :
.gitmodules et dans .git/config
Lors de renommages de sous-dossiers ou de changements d’URL, le fichier .gitmodules se retrouve désynchronisé.
Symptômes :
Solution :
Toujours mettre à jour les deux fichiers :
git mv old/path new/path
git add .gitmodules new/path
git commit -m "Fix submodule path"Très courant : les pipelines ne trouvent pas les submodules.
Symptômes :
Solution :
Dans GitHub Actions (exemple) :
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursiveOu dans n’importe quelle CI :
git submodule update --init --recursiveErreur :
Pointer le submodule sur main ou develop en espérant que Git suivra automatiquement les mises à jour.
Git ne mettra jamais à jour automatiquement un submodule.
Symptômes :
Solution :
Toujours pointer vers un tag ou un commit fixe.
C’est le principe même du fonctionnement des submodules.
Supprimer simplement un dossier de submodule provoque des incohérences internes dans .git.
Symptômes :
Solution :
Procédure complète (sécurisée) :
git submodule deinit -f path/to/module
rm -rf .git/modules/path/to/module
git rm -f path/to/module
git commit -m "Remove submodule"Les sous-modules Git sont un outil puissant mais à manier avec soin. Ils conviennent parfaitement aux architectures modulaires, aux environnements DevOps et aux projets où le versioning précis est critique.
Prenez le temps d’évaluer si vos besoins justifient la complexité. Bien utilisés, les sous-modules offrent une manière propre de composer un projet à partir de briques autonomes.