Hinweis: Meine Frage konzentriert sich auf mein spezielles Problem (das Liferay betrifft), aber ich hoffe, dass es für jeden nützlich sein kann, der verschiedene Versionen desselben Projekts auf git warten muss.
Ich arbeite in einer Firma, die viele Plugins für Liferay Portal schreibt . Diese Plugins (Portlets, Themes usw.) sind normalerweise wiederverwendbar und sollten natürlich für neue Versionen des Portals aktualisiert werden.
Es ist jedoch üblich, ein Portlet auf eine neue Version von Liferay zu migrieren und die vorherige Version beizubehalten. Außerdem müssen wir für einige Clients häufig sehr spezielle Anpassungen vornehmen, die nicht sinnvoll sind, um sie der "Hauptversion" hinzuzufügen.
Diese Voraussetzungen erschweren unsere Arbeit, aber zum Glück können wir einige Vereinfachungen annehmen. Beispielsweise werden die Plugins häufig nur von jeweils einem Programmierer aktualisiert. Es kommt sehr selten vor, dass einem Plugin zwei oder mehr Funktionen gleichzeitig hinzugefügt werden.
Jetzt migrieren wir nach Gitorious . Wir versuchen, ein Verzweigungsmodell für ein solches Szenario zu konzipieren.
Mein Modell
Was ich vorgeschlagen habe, war:
- Jedes Plugin würde innerhalb eines Projekts ein eigenes Repository in Gitorious haben. Ein Portlet zum Anzeigen von Kätzchen verfügt beispielsweise über ein
kittens-portlet
Repository innerhalb desliferay-portlets
Projekts. - Wenn Sie ein neues Plugin erstellen, erstellen Sie es in einem Zweig, der nach der Liferay-Version benannt ist (z. B.
lf5.2
). - Jedes Mal , wenn ein Update auf dem Plugin gemacht wird, wird das Update genehmigt und in der Produktion, markieren Sie das Plugin mit einer Version zum Einsatz (zum Beispiel
lf5.2v1
,lf5.2v2
etc.) * - Jedes Mal, wenn ein Plugin auf eine neue Version von Liferay portiert werden soll, verzweigen wir in die neueste Version (indem wir zum Beispiel den Zweig erstellen
lf6.0
). - Sobald der Leiter der neuen Niederlassung in Produktion ist, erhält er ein Tag wie
lf6.0v1
. - Jedes Mal, wenn wir ein Plugin kundenspezifisch anpassen müssen, erstellen wir eine Verzweigung mit dem Namen des Kunden (zum Beispiel erstellen wir eine Verzweigung
lf5.2clientcorp
für unseren Kunden "ClientCorp Inc.").
Dies ist ein ungewöhnliches Modell: Es hätte keine master
und viele nicht zusammenlaufende Zweige. Dies ist , wie ich glaube , ein Repository mit einem solchen Modell aussehen würde:
Ein Freund fand dieses System ziemlich komplex und fehleranfällig. Er schlug das ausgezeichnete und beliebte Modell von Vincent Driessen vor , das ich noch schwerer handhaben und disziplinieren konnte. Es ist natürlich großartig (und getestet!), Scheint aber zu komplex für unsere Situation zu sein.
Das Modell meines Freundes
Dann schlug er ein anderes Modell vor: Wir hätten ein Repository für jedes Plugin in einer Liferay-Version (also würden wir damit beginnen, ein kittens-lf5.2-portlet
und dann ein zu erstellen kittens-lf6.0-portlet
), jedes mit einer master
Verzweigung und einer develop
Verzweigung. Das master
wäre immer einsatzbereit. (Oder es könnte umgekehrt sein, master
und stable
, wie von Steve Losh vorgeschlagen ).
Das ist sehr einfach, aber mir hat dieses System nicht gefallen:
- Dies kann zu einer Vielzahl von Repositorys in einem Projekt führen, die das Durchsuchen von Gitorious erschweren.
- Der Name des Verzeichnisses des Projekts ist relevant. Wenn jemand das Repository in ein
kittens-lf6.0-portlet
Verzeichnis klont und die WAR mit ant generiert (wie üblich), wird auch der WAR-Name verwendetkittens-lf6.0-portlet
. Alte Versionen dieses Portlets (kittens-portlet
beispielsweise mit dem Namen "") werden in einem aktualisierten Portal als unterschiedliche (und wahrscheinlich fehlende) Portlets betrachtet. Ein bisschen Sorgfalt kann es vermeiden, aber ich würde es vorziehen, es zu vermeiden. - Die verschiedenen Versionen desselben Plugins würden getrennt bleiben. Ich breche mein Herz :(
kittens-lf6.0-portlet
ist ein hässlicher Name für ein Repository, denke ich.
Ich vermute, dass die beiden letzten Punkte - auch die beiden subjektiveren - der Hauptgrund für meine Abneigung sind. Trotzdem bleiben alle vier Einwände bestehen.
OTOH, mein Vorschlag kommt mir seltsam vor und ich frage mich, ob es versteckte Fehler gibt. OT3rdH git ist so leistungsfähig und flexibel, dass ich mich nicht schämen sollte, seine Möglichkeiten auszuloten.
Deshalb frage ich:
- Was wäre das beste Modell? Mein Vorschlag? Das Model meines Freundes? Das mittlerweile traditionelle Vincent-Driessen-System?
- Welches andere Verzweigungsmodell würden Sie vorschlagen?
- Wenn du mein Modell für schlecht hältst, warum denkst du das? Ich würde gerne lernen, was die Nachteile und blinden Flecken sind.
* Eigentlich würde ich es vorziehen, das Commit mit einer Version zu markieren, v1
aber anscheinend ist ein Tag in git nicht für den Zweig gültig - das heißt, ich könnte kein 1- v1
Tag in lf5.2
und ein anderes in haben lf6.0
- also muss ich das benennen Ast. Ist es übrigens richtig?