Git: utilisation des submodules

Les projets informatique sont rarement composé d’un unique block contenant l’ensemble de l’application. Une gestion par «modules» indépendants permet une meilleure gestion globale des dépendances, cela implique souvent plusieurs repository avec des versions de code différents. Les SCM classiques ne permettent pas de lier facilement différentes versions de plusieurs modules au sein d’un seul projet avec une gestion centralisée. Git a ici changé la donne en proposant les sous-modules.

Un sous-module dans un dépôt git est équivalent a un sous repertoire contenant un dépôt git séparé. Git permet ensuite de gérer globalement à la fois le dépôt principal ainsi que les dépôts liés (avec par exemple des versions spécifiques de ceux-ci).

La gestion des sous-modules en Git s’effectue avec la commande suivante:

$ git submodule --help

Ajouter et initialiser un sous-module

Ajouter un sous-module est relativement simple, il suffit de se placer à la racine du Git principal et d’exécuter les commandes suivantes:

$ git submodule add git@gitserver:project external/project

Nous ajoutons ici dans le sous-répertoire external/project le dépôt Git externe git@gitserver:project. Git créée le fichier .gitmodules qui se présente ainsi:

$ cat .gitmodules
[submodule "external/project"]
path = external/project
url = git@gitserver:project

La commande add ne va pas exécuter le checkout du sous-module, dans external/project nous trouvons pour le moment un repertoire vide. Nous devons l’initialiser avec la commade suivante:

$ git submodule init

Par la suite, cette commande sera à exécuter à chaque fois qu’un nouveau clone du projet principal sera créé.

Mettre à jour un sous-module

Mettre à jour le sous-module est très simple:

$ git submodule update

Supprimer un sous-module

La suppression d’un sous-module est par contre plus complexe et impose d’éditer directement les fichiers de configuration Git. Voici la procédure à suivre:

1- Supprimer la section external/project du fichier .gitmodules manuellement ou avec la commande:

$ git config -f .git/config --remove-section submodule.$external/project

2- Supprimer les références au sous-module dans le fichier .git/config manuellement ou avec la commande:

$ git config -f .gitmodules --remove-section submodule.$external/project

3- Lancer la commande git rm —cached external/project

4- Commit le projet principal

5- Supprimer les fichiers dans external/project