Au fur et à mesure de la progression du projet, je me suis rendu compte que j’étais souvent en train de mettre à jour des librairies/framework que je n’avais pas codé.
Je trouve cela assez problématique puisque cela vient régulièrement polluer mon dépôt git. En effet, lorsque je met à jour mon dépôt Opencomp avec les nouvelles version de CakePHP ou de certains modules de CakePHP par exemple, je suis obligé de commiter des modifications qui « sémantiquement parlant » ne viennent pas de moi.
De façon logique, l’historique de ces modifications n’a donc rien à faire dans mon dépôt. Ce sont juste des librairies que j’utilise tel un service avec une API (le mode d’emploi pour s’en servir).
git submodule propose une solution élégante à ce problème.
Git, je vous en parlais en Avril 2011 (lire Adoption de Git pour le versionning du projet et Comment Github simplifie le versionning d’un projet ?) est la solution de gestion de version qui permet de garder un historique de l’ensemble des modifications effectuées sur le projet.
Concrètement, git submodule répond à la problématique que j’évoquais en introduction en permettant de créer une référence d’un commit d’un autre dépôt git au sein de mon dépôt.
Par exemple, je peux dire que le répertoire cakephp de mon dépôt ne contiendra pas de code mais référencera le commit 9cd54bd736f56884aaff1082ef86567fa807139f du dépot git://github.com/cakephp/cakephp.git qui correspond à la version 2.3.2 de CakePHP.
Les git submodule sont en fait des sous-dépôt Git, ce qui signifie que toutes les opérations qui l’on peut effectuer sûr un dépôt git le sont sur un dépôt ajouté avec git submodule.
Attention toutefois à ne pas oublier que les droits existants s’appliquent. Par exemple, si je fais une modification sur un dépôt qui ne m’appartiens pas (en lecture seule par exemple), je n’aurai pas la possibilité de pousser la modification vers le serveur distant (push).
J’ai ainsi utilisé git submodule pour gérer quelques dépendances d’Opencomp telles que CakePHP, DebugKit (une extension bien pratique permettant de visualiser les variables et bien d’autre choses) et TwitterBootstrap (un plugin permettant d’intégrer facilement le framework Bootstrap de Twitter dans un projet CakePHP).
Le petit aspect négatif que l’on peut relever concernant git submodule c’est que les dépôts liés de cette façon ne sont pas intégrés dans les archives générées par Github. Par exemple https://github.com/jtraulle/Opencomp/archive/develop.zip
Ce problème est connu et vient du fait que Github utilise la commande git export qui ne prend pas en compte les sous modules. Si vous voulez tout récupérer d’un seul coup et que vous être débrouillard, je vous conseille ce petit script Python que j’ai testé et qui fait absolument merveilleusement bien son job.
Pour en savoir plus sur git submodule, je vous recommande la lecture de cette page du manuel Pro Git en français qui détaille différents cas d’utilisation.
À bientôt 😉
Ping : Ou l'on reparle de gestion de dépendances
Ping : Dépendances : avec Bower et Composer, c'est simple !Jean Traullé