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:

  1. Créer un repo module-a et project-test.
  2. Push un fichier quelquonque sur le module-a
  3. 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"
  1. 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"

image

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 

image

Pour aller plus loin

Toutes les informations de ce tutoriel ont été prise dans la documentation de git