In einer git
Umgebung, in der wir die meisten Projekte modularisiert haben, haben wir es mit einem Projekt pro Repository oder mit mehreren Projekten pro Repository- Designproblem zu tun . Betrachten wir ein modularisiertes Projekt:
myProject/
+-- gui
+-- core
+-- api
+-- implA
+-- implB
Heute haben wir ein Projekt pro Repository . Es gibt Freiheit zu
release
Einzelkomponententag
Einzelkomponenten
Es ist jedoch auch umständlich für branch
Komponenten, da für das Verzweigen häufig api
gleichwertige Verzweigungen core
und möglicherweise andere Komponenten erforderlich sind .
Wenn wir release
einzelne Komponenten benötigen, können wir dennoch die gleiche Flexibilität erzielen, indem wir mehrere Projekte pro Repository- Design verwenden.
Welche Erfahrungen gibt es und wie / warum haben Sie diese Themen angesprochen?
java
programming-practices
version-control
git
maven
Johan Sjöberg
quelle
quelle
git-describe
.Antworten:
Es gibt drei Hauptnachteile
one project per repository
, wie Sie es oben beschrieben haben. Diese sind weniger zutreffend, wenn es sich um wirklich unterschiedliche Projekte handelt, aber von den Klängen her erfordern Änderungen an einem oft Änderungen an einem anderen, was diese Probleme wirklich übertreiben kann:git bisect
werden viel schwieriger zu verwenden, wenn Sie Ihr Repository in Unter-Repositorys aufteilen. Es ist möglich, es ist einfach nicht so einfach, was bedeutet, dass die Fehlersuche in Krisenzeiten viel schwieriger ist.git log
nur nicht ausgeben Geschichte als sinnvoll mit gebrochenen Repository - Strukturen. Sie können einige nützliche Ausgaben mit Submodulen oder Teilbäumen oder über andere skriptfähige Methoden erhalten, aber es ist einfach nicht dasselbe wie das Eingebentig --grep=<caseID>
odergit log --grep=<caseID>
Scannen aller Commits, die Sie interessieren. Ihre Geschichte wird schwerer zu verstehen, was sie weniger nützlich macht, wenn Sie sie wirklich brauchen.Am Ende ist es eine Opportunitätskostenkalkulation. Bei einem ehemaligen Arbeitgeber hatten wir unsere Hauptanwendung in 35 verschiedene Sub-Repositories aufgeteilt. Darüber hinaus haben wir einen komplizierten Satz von Skripten verwendet, um den Verlauf zu durchsuchen, um sicherzustellen, dass der Status (dh Produktions- und Entwicklungszweige) auf beiden Seiten identisch ist, und um sie einzeln oder in großen Mengen bereitzustellen.
Es war einfach zu viel; zumindest zu viel für uns. Der Verwaltungsaufwand machte unsere Funktionen weniger flink, die Bereitstellung viel schwieriger, das Unterrichten neuer Entwickler zu zeitaufwändig, und am Ende konnten wir uns kaum noch erinnern, warum wir das Repository überhaupt aufgebrochen hatten. An einem schönen Frühlingstag habe ich 10 US-Dollar für einen Nachmittag Cluster-Computing-Zeit in EC2 ausgegeben. Ich habe die Repos zusammen mit ein paar Dutzend
git filter-branch
Anrufen zurückgewebt. Wir haben nie zurückgeschaut.quelle
Christopher hat die Nachteile eines Ein-Projekt-pro-Repository-Modells sehr gut aufgezählt. Ich möchte einige der Gründe erörtern, aus denen Sie einen Ansatz mit mehreren Repositorys in Betracht ziehen könnten. In vielen Umgebungen, in denen ich gearbeitet habe, war ein Ansatz mit mehreren Repositorys eine vernünftige Lösung, aber die Entscheidung, wie viele Repositorys vorhanden sind und wo die Kürzungen vorgenommen werden müssen, war nicht immer einfach.
In meiner aktuellen Position habe ich ein gigantisches CVS-Repository mit einem einzigen Repository und einer über zehnjährigen Geschichte in eine Reihe von Git-Repositorys migriert. Seit dieser anfänglichen Entscheidung ist die Anzahl der Repositories (durch die Aktionen anderer Teams) so weit gestiegen, dass ich den Verdacht habe, dass wir mehr haben, als optimal wäre. Einige Neueinstellungen haben vorgeschlagen, die Repositories zusammenzulegen, aber ich habe mich dagegen ausgesprochen. Das Wayland-Projekt hat eine ähnliche Erfahrung. In einem Vortrag, den ich kürzlich gesehen habe, hatten sie zu einem bestimmten Zeitpunkt über 200 Git-Repositories, für die sich die Leitung entschuldigte. Wenn ich auf ihre Website schaue , sehe ich, dass sie jetzt bei 5 sind, was vernünftig erscheint. Es ist wichtig zu beachten, dass das Zusammenfügen und Aufteilen von Repositorys eine überschaubare Aufgabe ist und es in Ordnung ist, (im Rahmen der Vernunft) zu experimentieren.
Wann möchten Sie möglicherweise mehrere Repositorys?
Die Punkte 2 und 3 sind nur dann von Bedeutung, wenn Punkt 1 zutrifft. Durch die Aufteilung unserer Repositorys habe ich die Verzögerungen für unsere externen Kollegen erheblich verringert, den Festplattenverbrauch gesenkt und den Netzwerkverkehr verbessert.
4 und 5 sind subtiler. Wenn Sie die Repos von beispielsweise einem Client und einem Server aufteilen, ist die Koordinierung von Änderungen zwischen dem Client- und dem Server-Code teurer. Dies kann insofern positiv sein, als eine entkoppelte Schnittstelle zwischen beiden gefördert wird.
Selbst mit den Nachteilen von Multi-Repository-Projekten wird auf diese Weise viel seriöse Arbeit geleistet - Wayland und Boost kommen in den Sinn. Ich glaube nicht, dass sich ein Konsens in Bezug auf Best Practices entwickelt hat, und ein gewisses Urteilsvermögen ist erforderlich. Tools für die Arbeit mit mehreren Repositorys (Git-Teilbaum, Git-Submodul und andere) werden noch entwickelt und getestet. Mein Rat ist, zu experimentieren und pragmatisch zu sein.
quelle
Da wir GitHub verwenden, haben wir tatsächlich mehrere Projekte in einem Repo, aber stellen Sie sicher, dass diese Projekte / Module ordnungsgemäß modularisiert sind (wir verwenden -api und -core-Konventionen + Maven + statische und Laufzeitprüfung und gehen möglicherweise eines Tages sogar zu OSGi, um zu booten). .
Was spart es? Nun, wir müssen nicht mehrere Pull-Requests ausgeben, wenn wir etwas Kleines über mehrere Projekte hinweg ändern. Probleme und Wiki werden zentralisiert usw.
Wir behandeln jedes Modul / Projekt weiterhin als eigenständiges Projekt und erstellen und integrieren sie separat in unseren CI-Server usw.
quelle
submodules
das gesamte Repository ein oder geben es frei / markieren Sie es?git log -1 -- <project_dir>
). Es ist wirklich ganz toll. Diese Antwort verdient mehr Gegenstimmen.Der Hauptunterschied bei der Verwendung eines oder mehrerer Repositorys besteht für mich in den Antworten auf die folgenden Fragen:
Nur als Beispiel habe ich eine kleine Anwendung (nur Client), die die "Qualität" eines Subversion-Repository überprüft. Es gibt die Kernimplementierung, die von der Befehlszeile aus gestartet werden kann und gut mit Java 6 funktioniert. Ich habe jedoch damit begonnen, eine Benutzeroberfläche zu implementieren, die JavaFX als Teil von Java 8 verwendet. Ich habe also die 2 geteilt und eine erstellt zweites Repository (mit einem zweiten Build-Prozess), mit abweichendem Zeitplan, ...
Ich mag die Antworten oben (habe sie hochgestuft), aber ich denke, sie sind nicht die ganze wahre Geschichte. Daher wollte ich auch die Argumente für die Aufteilung von Repositorys hinzufügen. Die eigentliche Antwort (wann man sich trennt) könnte also irgendwo in der Mitte sein ...
quelle
Es könnte sein, dass der Git-Teilbaum (siehe Atlassian-Blog , Medium-Blog oder Kernel-Link ) gut zu Ihnen passt. Jedes Projekt auf oberster Ebene würde also einen Teilbaumsatz mit möglicherweise unterschiedlichen Versionen verwenden.
quelle
In Ihrem Beispiel sollten die Repositorys in Bezug auf ihre gegenseitige Abhängigkeit eingerichtet werden. Hier gelten alle Überlegungen zum Entwerfen von MicroServices und Domain Driven Design: In einigen Fällen ist doppelter Code akzeptabel, arbeiten Sie mit Schnittstellen, brechen Sie die Kompatibilität nicht, es sei denn, Sie müssen dies wirklich tun, usw.
Aus meiner Sicht sollte eine Benutzeroberfläche jetzt unabhängig vom Backend sein. Ein UI-Projekt-Repository sollte daher normalerweise den UI-Code und den Client-Controller enthalten. Der Client-Controller stellt eine abstrakte Verbindung mit den Service-Controllern her. Sie verwenden eine Service-Client- / API-Abstraktion, die separat vom Service versioniert wird, sodass ein Service aktualisiert werden kann, ohne die Clients zu beschädigen (es können mehrere verschiedene Clients vorhanden sein).
Ein Service selbst sollte also ein eigenes Repository sein. Meiner Ansicht nach handelt es sich bei dem Service nur um eine Zusammenfassung der Geschäftslogik mit einem einzigen Ansatzpunkt. Daher sollte die Geschäftslogik in der Regel von der Service-Technologie, die sie hostet, getrennt sein. Andererseits ist die Repository-Implementierung in der Regel so eng mit der Geschäftslogik verbunden, dass diese in dasselbe Repository integriert werden könnte. Aber auch dort kann Ihr Kilometerstand variieren.
Natürlich können einfache Projekte, die sich technologisch kaum ändern oder mehrere Stacks unterstützen, bei denen alle Benutzeroberflächen von derselben Quelle gehostet werden können wie das Back-End und die Back-End-Dienste in der Regel nur von demselben Client verwendet werden, von mehr profitieren fest integrierte Repositories.
In diesem Fall ist es wahrscheinlich in Ordnung, nur die volle Vertikale in einem Repository zu haben und sich darauf zu konzentrieren, sicherzustellen, dass Ihre funktionalen Domänen in ihrem eigenen Repository ordnungsgemäß eigenständig sind. Sie haben dann noch die meisten Vorteile kleinerer Repositories und sonst wenig Overhead.
quelle