Utilisation des submodules - vaul-ulaval/vaul-wiki GitHub Wiki
Setup de git avec submodule
Afin que le travail avec les submodules soient moins fastidieux, les settings suivants sont fortement recommandés:
git config --global diff.submodule log # Après un git diff, affiche aussi les nouveaux commits des submodules
git config --global status.submodulesummary true # Après un git status, affiche un résumé des commits des submodules
git config --global submodule.recurse true # Fais en sorte que toutes les commandes git (sauf clone), auront le flag --recurse-submodules
git config --global push.recurseSubmodules on-demand # S'assure qu'on ne puisse pas pousser des changements sans que les submodules soient eux aussi poussés
git config --global alias.sdiff '!'"git diff && git submodule foreach 'git diff'" # Ajout de la commande 'git sdiff' pour voir un diff de chaque submodule
git config --global alias.supdate '!'"git submodule update --remote --merge" # Ajout de la commande 'git supdate' pour l'update de submodules
Projet exemple
Supposons que nous avons le projet suivant. Les prochaines sections seront des exemples sur ce projet
- project-test
- module-a (submodule)
Afin de vous habituer avec les submodules, je vous suggère de créer ce même setup dans votre git personnel et de suivre les exemples. Voici comment:
- Créer un repo
module-a
etproject-test
. - Push un fichier quelquonque sur le
module-a
- Cloner
project-test
et faire les commandes suivantes:
cd project-test
git submodule init
git submodule add <Lien vers le repo module-a>
git add .
git commit -m "Initial commit"
- Pour chaque submodule, on doit définir sur quelle branche on veut toujours se référer sinon on sera toujours en HEAD detached
git submodule foreach 'git checkout main'
git supdate
Aller chercher des commits sur une remote d'un submodule
Scénario: Quelqu'un a travaillé sur le module-a
uniquement, mais le project-test
n'a pas encore recu les changements. On veut aller chercher les changements du module-a
, l'intégrer sur le project-test
et commit le tout.
git supdate module-a # Si on omet le nom de module, tous les modules seront updaté
git status
git add .
git commit -m "Message décrivant l'intégration réalisée"
Travailler sur un submodule directement
Scénario: Je veux travailler sur project-test
et le module-a
en même temps et ensuite pousser les changements sur module-a
et project-test
cd module-a
touch allo.txt
git add .
git commit -m "Ajout d'un beau fichier texte"
cd ..
git add .
git commit -m "Intégration du nouveau fichier texte sur le project-test"
git push # La commande push enverra les changements sur module-a et project-test
Pour aller plus loin
Toutes les informations de ce tutoriel ont été prise dans la documentation de git