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

Git subtree : intégrer un dépôt sans submodule

6 min de lecture

git subtree fusionne un dépôt externe dans un sous-dossier de votre projet, sans métadonnées séparées. Contrairement aux submodules, les collaborateurs n’ont rien de spécial à faire au clone — le code est directement dans le repo. Ce guide couvre l’ajout, la mise à jour, la contribution en retour et le comparatif avec les submodules.

Prérequis : Submodules et Remotes fondamentaux.

  • Ajouter un dépôt externe avec git subtree add sans fichier de configuration
  • Mettre à jour et contribuer des modifications vers le dépôt source
  • Comprendre les différences entre subtree et submodule
  • Choisir la stratégie adaptée selon votre organisation et vos équipes

Les submodules demandent à chaque collaborateur de connaître les commandes submodule. Un subtree est transparent :

  • Le code est dans le repo — pas de référence externe
  • git clone récupère tout, rien à initialiser
  • Pas de .gitmodules, pas de HEAD détaché
  • Les outils CI/CD fonctionnent sans configuration spéciale

Le compromis : l’historique est mélangé et les mises à jour sont plus verbeuses.

Fenêtre de terminal
# Ajouter le remote pour simplifier les futures commandes
git remote add lib-utils https://github.com/org/lib-utils.git
git fetch lib-utils
# Intégrer dans un sous-dossier
git subtree add --prefix=libs/utils lib-utils main --squash
  • --prefix=libs/utils : dossier de destination
  • lib-utils main : remote et branche source
  • --squash : compresse l’historique en un seul commit (recommandé pour garder un historique lisible)

Le résultat est un ou deux commits dans votre historique :

abc1234 Squashed 'libs/utils/' content from commit e4f5a6b
def5678 Merge commit 'abc1234' as 'libs/utils'
Fenêtre de terminal
git fetch lib-utils
git subtree pull --prefix=libs/utils lib-utils main --squash

Git fusionne les nouveautés de lib-utils/main dans votre sous-dossier. Avec --squash, un seul commit de merge apparaît dans votre historique.

Vous avez modifié du code dans libs/utils/ et voulez renvoyer les changements au dépôt d’origine :

Fenêtre de terminal
git subtree push --prefix=libs/utils lib-utils fix/correction

Git extrait les commits qui touchent libs/utils/, réécrit les chemins et les pousse vers la branche fix/correction du remote lib-utils.

Créez ensuite une pull request sur le dépôt d’origine.

split extrait un historique nettoyé sans pousser :

Fenêtre de terminal
git subtree split --prefix=libs/utils -b subtree-branch
git push lib-utils subtree-branch:fix/correction

Utile si vous voulez inspecter les commits avant de pousser.

Fenêtre de terminal
# 1. Ajouter le remote et le subtree
git remote add lib-utils https://github.com/org/lib-utils.git
git subtree add --prefix=libs/utils lib-utils main --squash
# 2. Travailler normalement — les fichiers sont dans libs/utils/
git add libs/utils/src/helper.py
git commit -m "fix: corriger le helper dans lib-utils"
# 3. Mettre à jour depuis l'amont
git subtree pull --prefix=libs/utils lib-utils main --squash
# 4. Contribuer en retour
git subtree push --prefix=libs/utils lib-utils fix/correction
CritèreSubmoduleSubtree
Métadonnées.gitmodules + ref dans l’indexAucune — code dans le repo
Clone--recurse-submodules nécessaireClone standard
HistoriqueSéparé (chaque repo le sien)Fusionné dans le parent
Mise à joursubmodule updatesubtree pull
ContributionPush dans le submodule directementsubtree push (extraction)
ComplexitéMoyenne-élevéeMoyenne
Taille du repoPetite (référence seulement)Plus grande (code intégré)
CI/CDConfiguration nécessaireTransparent
Détached HEADOui (après update)Non
  • Le sous-dépôt est rarement mis à jour
  • Les collaborateurs ne connaissent pas les submodules
  • L’intégration CI/CD doit être simple
  • Le code du sous-dépôt est petit
  • Le sous-dépôt évolue souvent et indépendamment
  • Plusieurs projets référencent le même sous-dépôt
  • Vous voulez une version figée précise
  • Le sous-dépôt est volumineux
SymptômeCause probableSolution
Conflits au subtree pullMélange --squash / pas --squashRestez cohérent : toujours --squash ou jamais
subtree push est lentHistorique volumineux à parcourirUtilisez split + push séparés
Working tree has modificationsFichiers non commitésCommitez ou stashez avant le subtree pull
refusing to merge unrelated historiesOubli de --squash au premier addRecommencez avec --squash ou ajoutez --allow-unrelated-histories
  • git subtree add intègre un dépôt dans un sous-dossier — aucune métadonnée externe
  • git subtree pull met à jour, push renvoie les modifications
  • --squash compresse l’historique — gardez la cohérence
  • Subtree = transparence et simplicité, submodule = séparation et contrôle
  • Les collaborateurs n’ont rien de spécial à faire au clone

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