Git Submodules ou Branches externes¶
Toutes les applications AbulÉdu utilisent du code en commun. Deux options sont possibles: soit le code commun est compilé sous forme de bibliothèques partagées (dll sous windows, so sous linux, dy* sous mac) ... soit on compile le code de ces libs dans nos applications au moment de la compilation du programme.
La 1ere option est la meilleure pour plein de bonnes raisons mais demande des compétences et du temps que nous n'avons pas. Nous avons donc décidés de compiler le code source des libs dans nos applications.
Au niveau du code source, l'arborescence est donc comme ceci: Arborescence_type et le code source des libs est donc dans la sous arborescence "lib".
SVN gère les branches externes très bien. Bzr fait appel à un plugin pour ça Bzr-externals ... mais Git semble faire appel encore à autre chose:
- http://stackoverflow.com/questions/571232/svnexternals-equivalent-in-git
- http://stackoverflow.com/questions/17194107/git-submodule-new-version-update/17199855#17199855
Ça porte donc le nom de submodules ou sous modules en français ... et à propos du français il y a de la doc: https://git-scm.com/book/fr/v1/Utilitaires-Git-Sous-modules
Nous sommes donc à la recherche d'un coup de main qui pourrait faire pour un projet "simple" la mise en oeuvre de la gestion des branches externes, vous pouvez vous appuyer sur le script git_external que j'ai développé en attendant mieux http://redmine.abuledu.org/issues/4874
Exemple, à l'heure actuelle si on clone le dépôt de mulot vous ne pouvez pas le compiler :
git clone http://redmine.abuledu.org/leterrier/leterrier-mulot/leterrier-mulot-git.git -b version-1.1-dev cd leterrier-mulot-git qmake -r
Vous ne pourrez pas le compiler car il manque les branches externes:
Reading /tmp/leterrier-mulot-git/src/src.pro Cannot read /tmp/leterrier-mulot-git/src/lib/abuleduapplicationv1/abuleduapplicationv1.pri: No such file or directory Cannot read /tmp/leterrier-mulot-git/src/lib/abuleduconstantesv1/abuleduconstantesv1.pri: No such file or directory Cannot read /tmp/leterrier-mulot-git/src/lib/abuleducommonstatesv1/abuleducommonstatesv1.pri: No such file or directory Cannot read /tmp/leterrier-mulot-git/src/lib/abuledustatemachinev1/abuledustatemachinev1.pri: No such file or directory Cannot read /tmp/leterrier-mulot-git/src/lib/abuleduexercicev1/abuleduexercicev1.pri: No such file or directory Cannot read /tmp/leterrier-mulot-git/src/lib/abuledutetev1/abuledutetev1.pri: No such file or directory Cannot read /tmp/leterrier-mulot-git/src/lib/abuledunetworkaccessmanagerv1/abuledunetworkaccessmanagerv1.pri: No such file or directory Cannot read /tmp/leterrier-mulot-git/src/lib/abuleduflatboutonv1/abuleduflatboutonv1.pri: No such file or directory Cannot read /tmp/leterrier-mulot-git/src/lib/abuledupageaccueilv1/abuledupageaccueilv1.pri: No such file or directory Cannot read /tmp/leterrier-mulot-git/src/lib/abuledugraphicmenuv1/abuledugraphicmenuv1.pri: No such file or directory Cannot read /tmp/leterrier-mulot-git/src/lib/abuledulabelv1/abuledulabelv1.pri: No such file or directory Cannot read /tmp/leterrier-mulot-git/src/lib/maia/maia.pri: No such file or directory Cannot read /tmp/leterrier-mulot-git/src/lib/abuledufilev1/abuledufilev1.pri: No such file or directory Cannot read /tmp/leterrier-mulot-git/src/lib/abuledumessageboxv1/abuledumessageboxv1.pri: No such file or directory Cannot read /tmp/leterrier-mulot-git/src/lib/abuledusplashscreenv1/abuledusplashscreenv1.pri: No such file or directory Cannot read /tmp/leterrier-mulot-git/src/lib/abuleduidentitesv1/abuleduidentitesv1.pri: No such file or directory Cannot read /tmp/leterrier-mulot-git/src/lib/abuleduwidgetassistantetapesv1/abuleduwidgetassistantetapesv1.pri: No such file or directory Cannot read /tmp/leterrier-mulot-git/src/lib/abuledupluginloaderv1/abuledupluginloaderv1.pri: No such file or directory Cannot read /tmp/leterrier-mulot-git/src/lib/abuledusingletonv1/abuledusingletonv1.pri: No such file or directory Cannot read /tmp/leterrier-mulot-git/src/lib/abuledulangv1/abuledulangv1.pri: No such file or directory Cannot read /tmp/leterrier-mulot-git/src/lib/abuleduandroidsupportv1/abuleduandroidsupportv1.pri: No such file or directory Cannot read /tmp/leterrier-mulot-git/src/lib/abuleduloggerv1/abuleduloggerv1.pri: No such file or directory Cannot read /tmp/leterrier-mulot-git/src/lib/abuleduloadinganimationv1/abuleduloadinganimationv1.pri: No such file or directory Cannot read /tmp/leterrier-mulot-git/src/lib/abuledumultimediav1/abuledumultimediav1.pri: No such file or directory Cannot read /tmp/leterrier-mulot-git/src/lib/abuledupicottsv1/abuledupicottsv1.pri: No such file or directory Cannot read /tmp/leterrier-mulot-git/src/lib/abuleduaudiov1/abuleduaudiov1.pri: No such file or directory Cannot read /tmp/leterrier-mulot-git/src/lib/abuleduaproposv1/abuleduaproposv1.pri: No such file or directory
il faut donc récupérer les branches externes de code source des différentes libs pour pouvoir continuer ... et c'est ça que nous aimerions automatiser à l'aide d'une solution officielle Git et non d'un script maison, il semblerait que les git submodules permettent de faire ça ... merci pour votre aide !
La solution est donc bien d'utiliser les submodules, vous pouvez donc télécharger l'ensemble des sources de l'application en ajoutant l'option --recursive à la fin de la commande, comme par exemple
git clone http://redmine.abuledu.org/leterrier/leterrier-mulot/leterrier-mulot-git.git -b version-1.1-dev --recursive
ou si jamais vous oubliez l'option --recursive vous pourrez vous "rattraper ensuite" à l'aide de
git clone http://redmine.abuledu.org/leterrier/leterrier-mulot/leterrier-mulot-git.git -b version-1.1-dev cd leterrier-mulot-git git submodule update --init --recursive
Si vous voulez ajouter un submodule dans votre projet, par exemple
git submodule add -b version-1.1-exemples http://redmine.abuledu.org/leterrier/leterrier-mulot/leterrier-mulot-git.git src/exemples
Et si vous devez mettre à jour vos sous modules (quand ils ont eu une amélioration par exemple) vous pouvez le faire en une seule commande (pensez ensuite à faire un commit & push) :
git submodule foreach git pull origin master