Aller au contenu
Développement medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

Git submodules : intégrer des dépôts externes

9 min de lecture

Un submodule Git est un dépôt Git imbriqué dans un autre. Le projet parent référence un commit précis du sous-dépôt, ce qui permet d’intégrer des bibliothèques, des outils ou des configurations partagées tout en gardant les historiques séparés. Ce guide couvre le workflow complet, de l’ajout à la mise à jour.

Prérequis : Remotes fondamentaux et Branches distantes.

  • Ajouter un submodule dans un dépôt existant et cloner avec ses submodules
  • Mettre à jour un submodule vers une nouvelle version du dépôt distant
  • Identifier les pièges classiques : HEAD détaché, oubli de commit, double push
  • Comparer submodules et git subtree pour choisir la bonne approche

Les submodules sont utiles quand :

  • Vous intégrez une bibliothèque partagée entre plusieurs projets
  • Vous voulez une version figée d’une dépendance (pas toujours la dernière)
  • Les dépôts doivent garder des historiques indépendants
  • Chaque équipe gère son propre dépôt

Exemples concrets : un framework interne, des fichiers de configuration Terraform partagés, un thème de documentation.

Fenêtre de terminal
git submodule add https://github.com/org/lib-utils.git libs/utils

Cette commande :

  1. Clone lib-utils dans libs/utils/
  2. Crée (ou met à jour) le fichier .gitmodules :
[submodule "libs/utils"]
path = libs/utils
url = https://github.com/org/lib-utils.git
  1. Enregistre le commit exact du submodule dans l’index du projet parent

Commitez les changements :

Fenêtre de terminal
git add .gitmodules libs/utils
git commit -m "chore: ajouter lib-utils comme submodule"
Fenêtre de terminal
git clone --recurse-submodules https://github.com/org/mon-projet.git
Fenêtre de terminal
git submodule init # Enregistre les URLs depuis .gitmodules
git submodule update # Clone les submodules au commit référencé

Ou en une seule commande :

Fenêtre de terminal
git submodule update --init --recursive

--recursive gère aussi les submodules imbriqués (submodules de submodules).

  1. Allez dans le dossier du submodule :

    Fenêtre de terminal
    cd libs/utils
  2. Mettez à jour depuis le remote :

    Fenêtre de terminal
    git fetch
    git checkout main
    git pull
  3. Revenez au projet parent et commitez la nouvelle référence :

    Fenêtre de terminal
    cd ../..
    git add libs/utils
    git commit -m "chore: mettre à jour lib-utils vers v2.1"
Fenêtre de terminal
git submodule update --remote

Cette commande fetch et checkout la dernière version de la branche configurée pour chaque submodule.

Pour changer la branche suivie :

Fenêtre de terminal
git config -f .gitmodules submodule.libs/utils.branch develop

Vous pouvez modifier le code du submodule directement :

  1. Entrez dans le submodule et créez une branche :

    Fenêtre de terminal
    cd libs/utils
    git switch -c fix/typo
  2. Modifiez, commitez :

    Fenêtre de terminal
    git add .
    git commit -m "fix: corriger typo dans README"
  3. Poussez vers le remote du submodule :

    Fenêtre de terminal
    git push origin fix/typo
  4. Revenez au projet parent et enregistrez le nouveau commit :

    Fenêtre de terminal
    cd ../..
    git add libs/utils
    git commit -m "chore: avancer lib-utils (fix typo)"

Ajoutez cette option aux commandes courantes pour ne pas oublier les submodules :

Fenêtre de terminal
git pull --recurse-submodules
git checkout --recurse-submodules branche
git clone --recurse-submodules url

Pour l’activer par défaut :

Fenêtre de terminal
git config --global submodule.recurse true

Il n’y a pas de commande unique. Voici la procédure :

Fenêtre de terminal
# 1. Supprimer l'entrée du staging et du dossier
git rm libs/utils
# 2. Supprimer les métadonnées internes
rm -rf .git/modules/libs/utils
# 3. Commiter
git commit -m "chore: supprimer le submodule lib-utils"
Fenêtre de terminal
# Afficher le statut de tous les submodules
git submodule foreach 'git status'
# Mettre à jour tous les submodules
git submodule foreach 'git pull origin main'
# Stasher dans tous les submodules
git submodule foreach 'git stash'

Après git submodule update, le submodule est toujours en detached HEAD (il pointe vers un commit, pas une branche). Pour travailler dedans, créez ou checkoutez une branche :

Fenêtre de terminal
cd libs/utils
git switch main

Le projet parent voit que le submodule pointe vers un commit différent de celui référencé. C’est normal si vous avez fait un git pull dans le submodule. Commitez la mise à jour dans le parent :

Fenêtre de terminal
git add libs/utils
git commit -m "chore: avancer lib-utils"
Fenêtre de terminal
# Voir les détails
git diff --submodule
# Résumé
git diff --submodule=short

Pour avoir le résumé automatiquement :

Fenêtre de terminal
git config --global diff.submodule log
CritèreSubmodulesSubtreeGestionnaire de paquets
HistoriquesSéparésFusionnéNon versionné
Mise à jourManuelle (commit ref)git subtree pullnpm update, etc.
ComplexitéMoyenne-élevéeMoyenneFaible
CloneNécessite --recurseAutomatiqueNécessite install
Contribution au sous-projetFacile (push dans le submodule)Possible (subtree push)Via le repo original
SymptômeCause probableSolution
Dossier submodule vide après clone--recurse-submodules oubliégit submodule update --init --recursive
HEAD détaché dans le submoduleComportement normalgit switch branche pour travailler
reference is not a tree au cloneCommit du submodule non pousséPousser le submodule d’abord
Conflit sur la ref du submoduleDeux branches avancent le submoduleRésolvez en choisissant le bon commit
fatal: No url found for submodule.gitmodules absent ou corrompuVérifiez/recréez .gitmodules
  • Un submodule référence un commit précis d’un dépôt externe
  • git submodule update --init --recursive est la commande à retenir pour initialiser
  • Après update, le submodule est en detached HEAD — normal
  • Poussez toujours le submodule avant le parent
  • submodule.recurse true simplifie la vie au quotidien
  • Pour des besoins plus simples, considérez subtree

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn