Les sous-modules de Git

Git-Icon-1788C

Les sous-modules de Git permettent d’imbriquer des dépôts Git dans une arborescence. Le dépôt principal contient les références aux sous-modules, et aux commits associés. Prenons un exemple :

Dans votre application, vous voulez utiliser une librairie gérée dans un autre dépôt que celui de votre application. Cette librairie devrait se trouver dans l’arborescence de votre projet, dans le dossier « libs ».

Clonons le projet principal :

$ git clone ssh://git@gitlab.netapsys.fr:/netapsys/my_projet.git projet

Ajoutons un sous-module :

$ cd projet
$ git submodule add ssh://git@gitlab.netapsys.fr:/netapsys/ma_librairie.git libs/my_lib

Et voila ! Lorsque l’on fait la demande à Git quels que soient les changements, nous voyons bien les modifications apportées :

$ git status
A .gitmodules
A libs/my-lib

Il suffit de commiter :

$ git commit -m "Ajout de la librairie"
$ git push

Pour vos collègues, les commandes ne sont pas beaucoup plus complexes :

$ git clone ssh://git@gitlab.netapsys.fr:/netapsys/my_projet.git projet

À ce stade, le dossier libs/my-lib existe … mais il est vide ! Il faut, initialiser les sous-modules :

$ git submodule update --recursive --init

À l’usage au quotidien, les choses se compliquent un petit peu si vous souhaitez faire évoluer le code de votre librairie. Imaginons qu'un de vos collègues veuille corriger un bug dans cette librairie. S'il va dans le dossier libs/my-lib :

$ cd libs/my-lib
$ git branch
* (HEAD détachée sur e9af2d5)
  master

Comme vous pouvez le constater, le sous-module ne suit pas une branche, mais un commit. Il faut donc, avant toute modification, positionner votre sous-module sur une branche :

$ git checkout master

Vous pouvez ensuite faire vos modifications et commiter, sous conditions de vous trouver dans le dossier du sous-module lorsque vous lancez des commandes Git. Mais que se passe-t-il dans le dépôt principal ?

$ cd ../..
$ git status
Sur la branche master
Votre branche est à jour avec 'origin/master'.
   modifié : my-lib (nouveaux commits)

Il va falloir commiter la modification du numéro de commit de référence dans notre dépôt principal.

$ git add libs/my-lib
$ git commit -m "Mise à jour de my-lib"
$ git push

Pour vos collègues, la modification sera visible lors d'un pull :

$ git pull
$ git status
Sur la branche master
   modifié : my-lib (nouveaux commits)

Mais le sous-module n'est pas mis à jour. Il faut ajouter la même commande que précédemment.

$ git submodule update --recursive –init
Chemin de sous-module 'libs/my-lib' : '7b44405543ec32b3ed8f861f3b5943899cb42228' extrait

Voilà, c’est fini, vos collègues utilisent la même version que vous de votre librairie corrigée.

Avec un peu de rigueur de la part de l’ensemble des collaborateurs qui travaillent sur le projet, vous pourrez gérer les modifications de vos librairies dans des dépôts Git séparés, et les partager facilement entre vos projets et avec vos collègues !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.