Aller au contenu
Développement medium

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 tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn