Ein anständiges Git-Verzweigungsmodell für Produkte, die die Version eines anderen Produkts von Drittanbietern (und die Vor- und Nachteile eines Angebots) begleiten sollen

13

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:

  1. 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-portletRepository innerhalb des liferay-portletsProjekts.
  2. Wenn Sie ein neues Plugin erstellen, erstellen Sie es in einem Zweig, der nach der Liferay-Version benannt ist (z. B. lf5.2).
  3. 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.2v2etc.) *
  4. 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).
  5. Sobald der Leiter der neuen Niederlassung in Produktion ist, erhält er ein Tag wie lf6.0v1.
  6. 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.2clientcorpfür unseren Kunden "ClientCorp Inc.").

Dies ist ein ungewöhnliches Modell: Es hätte keine masterund viele nicht zusammenlaufende Zweige. Dies ist , wie ich glaube , ein Repository mit einem solchen Modell aussehen würde:

Wie würden meine Filialen wohl funktionieren?

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-portletund dann ein zu erstellen kittens-lf6.0-portlet), jedes mit einer masterVerzweigung und einer developVerzweigung. Das masterwäre immer einsatzbereit. (Oder es könnte umgekehrt sein, masterund stable, wie von Steve Losh vorgeschlagen ).

Das ist sehr einfach, aber mir hat dieses System nicht gefallen:

  1. Dies kann zu einer Vielzahl von Repositorys in einem Projekt führen, die das Durchsuchen von Gitorious erschweren.
  2. Der Name des Verzeichnisses des Projekts ist relevant. Wenn jemand das Repository in ein kittens-lf6.0-portletVerzeichnis klont und die WAR mit ant generiert (wie üblich), wird auch der WAR-Name verwendet kittens-lf6.0-portlet. Alte Versionen dieses Portlets ( kittens-portletbeispielsweise 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.
  3. Die verschiedenen Versionen desselben Plugins würden getrennt bleiben. Ich breche mein Herz :(
  4. 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:

  1. Was wäre das beste Modell? Mein Vorschlag? Das Model meines Freundes? Das mittlerweile traditionelle Vincent-Driessen-System?
  2. Welches andere Verzweigungsmodell würden Sie vorschlagen?
  3. 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, v1aber anscheinend ist ein Tag in git nicht für den Zweig gültig - das heißt, ich könnte kein 1- v1Tag in lf5.2und ein anderes in haben lf6.0- also muss ich das benennen Ast. Ist es übrigens richtig?

brandizzi
quelle
Wie oft müssen Sie in Ihrem Modell dasselbe Feature oder dieselbe Fehlerbehebung mehreren Zweigen hinzufügen?
Karl Bielefeldt
@KarlBielefeldt Ist eigentlich selten. Ein Fehler in einer Version des Portals ist in einer anderen Version meistens bedeutungslos und wird dennoch während der Migration behoben. Die vorherige Version wird nicht gleichzeitig gepatcht, es sei denn, der Client fragt danach. Ein vom Kunden angepasstes Plugin könnte theoretisch das neue Feature / den Bugfix erhalten, aber ich habe das noch nie gesehen, auch weil Client-Zweige ein seltener letzter Ausweg sind: Wir versuchen, das Plugin zu verallgemeinern, anstatt es auf eine kundenspezifische Weise anzupassen. Ich habe die Erfahrung gemacht, dass es ungewöhnlich ist, Änderungen von einem Zweig in einen anderen zu bekommen.
Brandizzi

Antworten:

2

Wenn ich das richtig lese, sind Zweige im Grunde genommen eine einmalige Abweichung von Ihrer Hauptentwicklungslinie, die niemals dazu gedacht ist, wieder mit der Hauptlinie zusammengeführt zu werden, und Fortschritte in der Hauptlinie werden niemals auf diese Zweige angewendet. Die einzige Abweichung wäre, dass Fehlerbehebungen, die der Version entsprechen, auf der die Verzweigung basiert, auf die Verzweigung angewendet werden müssen.

Die Antwort hängt nun von Ihrem täglichen Arbeitsablauf ab. Die Anzahl der Entwickler, die an einem Zweig arbeiten, oder die Anzahl der Änderungen sind Red Herings. Ich sehe Ihr primäres Bedürfnis darin, zu wissen, welche Zweige durch einen Hauptzweigwechsel ein Bugfix-Update erhalten, und aus diesem Grund denke ich, dass das kombinierte Repository mit Zweigen effizienter sein wird, da es sich um alles an einem Ort handelt. Gab es nie eine Notwendigkeit für eine Fremdbestäubung, dann würden separate Repositories dies erzwingen, aber dieses Szenario entspricht nicht der Realität Ihres Projekts, wie ich es verstehe.

Das Driessen-Modell würde gut funktionieren, wenn Ihr Projekt Zweige wieder in die Hauptentwicklungslinie einbinden müsste, aber das brauchen Sie nicht. Trotzdem halte ich es für sinnvoll, ein InDevelopment- und StableRelease-Konzept beizubehalten, wenn Sie an einem Produkt arbeiten, das live ist.

Zusammenfassend denke ich also, dass Ihr Projekt gut mit Ihrem Verzweigungsmodell und einem Schuss Driessen für Ihre Hauptlinie zusammenarbeiten würde. Ihr Kilometerstand kann variieren. Ich habe immer mit einem Zweig "Pending Release" gearbeitet, der sich in einen Zweig "Live" und einen separaten Zweig "Next Release" verwandelt, die alle eine gegenseitige Überprüfung von Fixes und Änderungen an verschiedenen Stellen erfordern, damit meine Wahrnehmung verzerrt sein kann.

Patrick Hughes
quelle
3

Was mich wundert, ist die Tatsache, dass jedes Portlet ein eigenes Repository hat (aber Ihre Geschichte ist möglicherweise nicht vollständig). Persönlich würde ich ein Repository pro Projekt erstellen. Projekte haben oft mehrere Portlets und werden alle in derselben Ausführung mit derselben Version von Liferay erstellt. Jedes Projekt kann ein Duplikat eines vorhandenen Projekts sein, das mit einer anderen Version von Liferay erstellt wurde, aber ich würde ein Produkt nur aufteilen, wenn die Unterschiede zu groß sind. Wenn ein Build gegen Liferay 5.1 und 5.2 funktioniert, würde ich das Projekt nicht aufteilen. Ich würde Scripting oder Maven (oder beides) verwenden, um alles funktionieren zu lassen. Ich würde ein Wiki (oder Trello) für die Verwaltung jedes Produkts verwenden und mit welcher Version von Liferay es erstellt werden kann.

Übrigens: Ich bin Java-Programmierer, Maven-Spezialist, Build-Spezialist und habe Erfahrung mit Liferay und anderen Portalservern (IBM WebSphere und Glassfish).

Das sind aber nur meine 0,02 €.

Ivo Limmen
quelle