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?
quelle
Antworten:
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.
quelle
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 €.
quelle