Remarque: Ma question se concentre sur mon problème spécifique (qui concerne Liferay) mais j'espère que cela peut être utile pour quiconque a besoin de maintenir différentes versions d'un même projet sur git.
Je travaille sur une entreprise qui écrit de nombreux plugins pour Liferay Portal . Ces plugins (portlets, thèmes, etc.) sont généralement réutilisables et, bien sûr, doivent être mis à jour pour les nouvelles versions du portail.
Cependant, il est habituel de devoir migrer, disons, un portlet vers une nouvelle version de Liferay et de conserver sa version précédente. De plus, nous devons fréquemment créer des personnalisations très spécifiques pour certains clients, ce qui n'a pas de sens d'être ajouté à la "version principale".
Ces conditions compliquent notre travail mais, heureusement, nous pouvons supposer quelques simplifications. Par exemple, les plugins sont fréquemment mis à jour par un seul programmeur à la fois. Il est très rare que deux ou plusieurs fonctionnalités soient ajoutées à un plugin en même temps.
Maintenant, nous migrons vers Gitorious . Nous essayons de concevoir un modèle de branchement pour un tel scénario.
Mon modele
Ce que j'ai proposé était:
- Chaque plugin aurait son propre référentiel dans Gitorious à l'intérieur d'un projet. Par exemple, un portlet pour afficher les chatons aurait un
kittens-portlet
référentiel à l'intérieur duliferay-portlets
projet. - Lors de la création d'un nouveau plugin, créez-le dans une branche nommée en fonction de la version de Liferay (par exemple,
lf5.2
). - Chaque fois qu'une mise à jour est faite sur le plug - in, la mise à jour est approuvé et déployé dans la production, étiquette le plug - in avec une version (par exemple
lf5.2v1
,lf5.2v2
etc.) * - Chaque fois qu'un plugin doit être porté sur une nouvelle version de Liferay, nous branchons la version la plus récente (créant, par exemple, la branche
lf6.0
). - Une fois en production, le chef de la nouvelle branche recevra un tag tel que
lf6.0v1
. - Chaque fois que nous devons personnaliser un plugin d'une manière spécifique au client, nous créons une branche avec le nom du client (par exemple, nous
lf5.2clientcorp
créerions une branche pour notre client "ClientCorp Inc.")
Il s'agit d'un modèle inhabituel: il n'y aurait pas master
et beaucoup de branches non fusionnées. Voici à quoi je suppose qu'un référentiel avec un tel modèle ressemblerait:
Un ami a trouvé ce système plutôt complexe et sujet aux erreurs. Il a suggéré l'excellent et populaire modèle Vincent Driessen , que j'ai trouvé encore plus difficile à gérer et à discipliner. C'est génial (et testé!) Bien sûr mais semble trop complexe à notre situation.
Le modèle de mon ami
Puis il a suggéré un autre modèle: nous aurions un référentiel pour chaque plugin dans une version Liferay (donc nous commencerions à créer un kittens-lf5.2-portlet
puis un a kittens-lf6.0-portlet
), chacun avec une master
branche et une develop
branche. Le master
serait toujours prêt pour le déploiement. (Ou ce pourrait être l'inverse, master
et stable
, comme l'a suggéré Steve Losh ).
C'est très simple, mais je n'ai pas aimé ce système:
- il pourrait en résulter un grand nombre de référentiels dans un projet, rendant Gitorious difficile à parcourir.
- Le nom du répertoire du projet est pertinent. Si quelqu'un clone le référentiel dans un répertoire
kittens-lf6.0-portlet
et génère le WAR avec ant (comme d'habitude), le nom du WAR serakittens-lf6.0-portlet
également. Les anciennes versions de ce portlet (nomméeskittens-portlet
par exemple) seraient considérées comme des portlets différents (et probablement manquants) dans un portail mis à niveau. Un peu de soin peut l'éviter mais je préférerais l'éviter. - Les différentes versions du même plugin seraient maintenues à part. Je brise mon coeur :(
kittens-lf6.0-portlet
est un nom moche pour un référentiel, je pense.
Je soupçonne que les deux derniers points - qui sont aussi les deux plus subjectifs - sont la principale raison de ma réticence. Néanmoins, les quatre objections sont valables.
OTOH, ma propre proposition me semble étrange et je me demande s'il y a des bugs cachés dessus. OT3rdH git est si puissant et flexible que je pense que je ne devrais avoir aucune honte à explorer ses possibilités.
Alors je demande:
- Quel serait le meilleur modèle? Ma proposition? Le modèle de mon ami? Le système désormais traditionnel de Vincent Driessen?
- Quel autre modèle de branchement proposeriez-vous?
- Si vous pensez que mon modèle est mauvais, pourquoi pensez-vous que oui? J'aimerais savoir quels sont les inconvénients et les angles morts.
* En fait, je préférerais baliser le commit avec une version telle que v1
mais apparemment une balise dans git n'est pas portée dans la branche - c'est-à-dire que je ne pouvais pas avoir une v1
balise 1 lf5.2
et une autre lf6.0
- donc je dois branche. Est-ce correct BTW?