Le modèle subtree
Un subtree fusionne l'histoire d'un autre dépôt dans un sous-répertoire du vôtre. Contrairement aux submodules, il n'y a pas de gitlink séparé ni de commande supplémentaire requise pour cloner — quiconque clone votre repo obtient automatiquement le contenu du subtree. Le coût est une histoire plus dense ; le bénéfice est la simplicité opérationnelle.
Ajouter un subtree
git subtree add --prefix=third_party/lib \
https://github.com/example/lib main --squash
Le flag --squash écrase l'histoire importée en un seul commit.
Tirer les mises à jour
git subtree pull --prefix=third_party/lib \
https://github.com/example/lib main --squash
git remote add lib https://github.com/example/lib
git subtree pull --prefix=third_party/lib lib main --squash
Pousser vers upstream
git subtree push --prefix=third_party/lib lib feature-branch
Subtree vs submodule
Choisissez les subtrees quand vous voulez un clone sans friction pour les nouveaux venus. Choisissez les submodules quand vous devez ancrer à un SHA upstream exact.
Diviser un sous-répertoire
git subtree split --prefix=third_party/lib -b lib-only
cd ..
git clone /path/to/parent --branch lib-only lib-extracted
Erreurs courantes
Oublier --squash importe des dizaines de milliers de commits upstream.
Alternative : stratégie merge subtree
git remote add -f lib https://github.com/example/lib
git merge -s ours --no-commit --allow-unrelated-histories lib/main
git read-tree --prefix=third_party/lib/ -u lib/main
git commit -m "Subtree merge of lib"