Gruppieren mehrerer Git-Repositorys, die Teil desselben Gesamtprojekts sind


14

Angenommen, ich habe ein Projekt mit mehreren Komponenten: einer Serverkomponente, einer Web-App-Komponente, einer iOS-Komponente, einer Android-Komponente usw. Diese Komponenten sind alle separate Codebasen, sind jedoch auch lose miteinander verbunden (z. B. eine Änderung des Servers) Code könnte auch eine Änderung an allen anderen Komponenten erfordern)

Was ist der effizienteste Weg in Git, um dieses Projekt zu organisieren? Wenn Sie alles in ein Repository packen, würden Sie immer die neuesten Versionen haben, aber die Dinge werden ziemlich chaotisch, wenn Sie anfangen, eine Komponente und nicht die anderen zu ändern.

Wenn Sie andererseits jede Komponente als separates Repository einrichten, wie können Sie diese Repositorys "verknüpfen", damit Sie wissen, dass Version 2.0 der App Version 1.5 der Serverkomponente usw. erfordert?

Gibt es eine Funktion in git, die es nicht erlaubt, aktuelle Readmes (oder eine bessere Lösung, die ich nicht sehe) zu führen, um mehrere verwandte Repos effektiver zu verwalten?


Sind diese Komponenten tatsächlich voneinander abhängig, etwa die Beziehung zwischen einer freigegebenen Komponente und einer Bibliothek? Oder versuchen Sie nur, alle lösbaren Komponenten synchron zu halten?
Nutzlos

Hier ist eine ältere Diskussion über StackOverflow (auf wundersame Weise noch nicht geschlossen).
Dan Dascalescu

Antworten:


6

Unterprojekte sind der Ort, an dem verteilte Versionskontrollsysteme (DVCS) anfangen, wenn nicht gar zu entwirren, sicherlich ein wenig wackelig werden.

Git- Submodule und Mercurial- Subrepositories zielen beide auf die Unterstützung von Subprojekten ab . Beide haben Release-by-Release verbessert (bis zu dem Punkt, dass Mercurials alte "diese Funktion existiert, aber Sie sollten sie wahrscheinlich nicht verwenden" Warnung ist nicht länger frontal und zentriert.)

Trotzdem bleiben Multi-Projekt-Repos eher ein spezieller Anwendungsfall als eine Funktion, die jeder nutzt. Die Dokumentation enthält zahlreiche Vorbehalte und Anleitungen, die verdeutlichen, dass das Verwalten von "Projekten von Projekten" eine zweistufige Angelegenheit ist, wobei sich das Metamanagement geringfügig, aber wirklich von dem direkten einstufigen Projektmanagement unterscheidet. Infolgedessen gibt es dort viel weniger Erfahrung. Und es gibt keinen Mangel an "benutze keine Git-Submodule!" und "meide mercurial subrepos!" Kommentare und Blog-Beiträge.

Meine eigenen Erfahrungen mit Subrepos waren gemischt. Es hat funktioniert ... aber es war auch nervig. Ich liebe die Idee von Unterprojekten, aber in der Praxis finde ich, dass die Alternativen - entweder große All-in-One-Repos oder begleitende Geschwisterprojekte - leichter umstritten sind (obwohl sie weniger elegant sind). Ich freue mich auf den Tag, an dem Subrepos Mainstream sind und kein Schmerz, aber das habe ich noch nicht erlebt.

Das heißt nicht, dass das Verwalten von Submodulen / Subrepos für Sie nicht funktioniert, aber es ist etwas, das mit Sorgfalt durchgeführt werden sollte, und definitiv einige vorherige Experimente und Planungen.

Angesichts der Tatsache, dass Sie sich auf Git konzentrieren, sollten Sie auch Git-Unterstrukturen untersuchen, die für einige eine bessere Alternative zu Git-Submodulen darstellen .


1
Überarbeitung im Jahr 2016: In HG- Dokumenten werden Subrepos immer noch als letzte Möglichkeit bezeichnet . Git-Dokumente sind begeisterter und das Modul- Feature ist jetzt stärker integriert. Beide können jetzt auch gut mit verschachtelten Repos umgehen (da sie erkennen, dass das verschachtelte Repo "den Ball" mit den von ihm verwalteten Dateien hat), was eine weitere nützliche Sub-Repo-Option darstellt. DVCS-Tools sind jedoch auf einstufigen Repos nach wie vor von großer Bedeutung, sodass Warnungen zu "Unter-Repos => Verwaltung auf mehreren Ebenen" und "Drachen sind hier" weiterhin relevant sind.
Jonathan Eunice

2

Wenn Sie C # verwenden, können Sie NuGet verwenden.

Machen Sie jede Komponente zu einer Bibliothek und bewahren Sie sie in ihrem eigenen Repository auf. Machen Sie Releases der Basiskomponenten, die Sie gemäß der semantischen Versionierung versionieren.

Lassen Sie Ihren Buildserver die Bibliotheken schließlich in NuGet-Pakete packen und verwenden Sie diese NuGet-Pakete in den Projekten für die Front-End-Komponenten (iOS, Android).

Der gleiche grundlegende Ansatz (Versions- und Paketabhängigkeiten) kann auch in anderen Sprachen verwendet werden, ist jedoch möglicherweise nicht so praktisch.

Ich würde nicht empfehlen, Git-Submodule zu verwenden. Obwohl es theoretisch für diese Art von Problemen verwendet werden kann, halte ich es für einen größeren Aufwand, als es sich lohnt.


2

Meiner Meinung nach würde dies davon abhängen, wie stark sie tatsächlich gekoppelt sind. Es ist wirklich schön, eine automatische Ausführung git bisectzu haben, wenn eine Regression aufgespürt wird. Dies ist jedoch schwierig, wenn jedes Commit von einer anderen Version Ihrer anderen auszuführenden Abhängigkeiten abhängt.

Zwei mögliche Optionen wären ein Repository mit Submodulen oder mehrere Repositorys mit bewährten Versionspraktiken.

Wie können Sie diese Repositorys "verknüpfen", damit Sie wissen, dass Version 2.0 der App Version 1.5 der Serverkomponente usw. erfordert?

Dies ist normalerweise die Domäne eines Abhängigkeitsverwaltungsframeworks (z. B. Gradle, Maven), nicht Git selbst.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.