GIT-Repository-Layout für Server mit mehreren Projekten

96

Eines der Dinge, die mir an der Einrichtung von Subversion gefallen, ist, dass ich ein einziges Haupt-Repository mit mehreren Projekten haben kann. Wenn ich an einem Projekt arbeiten möchte, kann ich genau dieses Projekt überprüfen. So was

\main
    \ProductA
    \ProductB
    \Shared

dann

svn checkout http://.../main/ProductA

Als neuer Benutzer von git möchte ich einige bewährte Methoden in diesem Bereich kennenlernen, bevor ich mich auf einen bestimmten Workflow einlasse. Nach dem, was ich bisher gelesen habe, speichert git alles in einem einzigen .git-Ordner im Stammverzeichnis des Projektbaums. Ich könnte also eines von zwei Dingen tun.

  1. Richten Sie für jedes Produkt ein eigenes Projekt ein.
  2. Richten Sie ein einzelnes umfangreiches Projekt ein und speichern Sie Produkte in Unterordnern.

Es gibt Abhängigkeiten zwischen den Produkten, so dass das einzelne massive Projekt angemessen erscheint. Wir werden einen Server verwenden, auf dem alle Entwickler ihren Code teilen können. Ich habe dies bereits über SSH & HTTP und den Teil, den ich liebe. Die Repositorys in SVN haben jedoch bereits eine Größe von vielen GB. Daher scheint es eine schlechte Idee zu sein, das gesamte Repository auf jedem Computer zu verschieben - insbesondere, da uns eine übermäßige Netzwerkbandbreite in Rechnung gestellt wird.

Ich würde mir vorstellen, dass die Linux-Kernel-Projekt-Repositorys gleich groß sind, also muss es einen richtigen Weg geben, dies mit Git zu handhaben, aber ich habe es nur noch nicht herausgefunden.

Gibt es Richtlinien oder Best Practices für die Arbeit mit sehr großen Repositorys für mehrere Projekte?

Paul Alexander
quelle

Antworten:

65

Die Richtlinie ist in Bezug auf Git-Grenzen einfach :

  • ein Repo pro Projekt
  • ein Hauptprojekt mit Submodulen .

Die Idee ist nicht, alles in einem riesigen Git-Repo zu speichern , sondern ein kleines Repo als Hauptprojekt zu erstellen, das auf die richtigen Commits anderer Repos verweist, von denen jedes ein Projekt oder eine gemeinsame Komponente für sich darstellt.


Das OP Paul Alexander kommentiert :

Dies klingt ähnlich wie die von Subversion bereitgestellte "externe" Unterstützung.
Wir haben dies versucht und fanden es äußerst umständlich, die Versionsreferenzen in den externen Dateien ständig zu aktualisieren, da die Projekte gleichzeitig mit Abhängigkeiten voneinander entwickelt werden. Gibt es eine andere Option?

@Paul: Ja, anstatt die Version aus dem Hauptprojekt zu aktualisieren, haben Sie entweder:

  • Entwickeln Sie Ihre Teilprojekte direkt aus dem Hauptprojekt heraus (wie unter " Wahre Natur der Teilmodule " erläutert ).
  • oder Sie verweisen in einem Sub-Repo originauf dasselbe Sub-Repo, das an anderer Stelle entwickelt wird: Von dort müssen Sie nur die an anderer Stelle vorgenommenen Änderungen aus diesem Sub-Repo ziehen.

In beiden Fällen müssen Sie nicht vergessen, das Hauptprojekt festzuschreiben, um die neue Konfiguration aufzuzeichnen. Keine "externe" Eigenschaft, die hier aktualisiert werden muss. Der gesamte Prozess ist viel natürlicher.

Ehrlich gesagt klingt dies nach einem echten Schmerz und alles, was Entwickler jedes Mal manuell tun müssen, wird nur eine regelmäßige Quelle für Fehler und Wartung sein.
Ich nehme an, ich werde versuchen, dies mit einigen Skripten im Superprojekt zu automatisieren.

Ich antwortete:

Ehrlich gesagt, Sie haben vielleicht Recht gehabt ... das ist bis zur letzten Git-Version 1.7.1 .
git diffund git statusbeide lernten, Submodulzustände zu berücksichtigen, selbst wenn sie vom Hauptprojekt ausgeführt wurden.
Sie können die Modifikation des Submoduls einfach nicht verpassen.

Davon abgesehen:

VonC
quelle
Wenn Sie Submodule in das Hauptprojekt aufnehmen, ist jedes Submodul ein eigenes Git-Repository, sodass Sie bestimmte Versionen der Submodule, bestimmte Tags usw. einbinden können.
Damien Wilson
1
@VonC: Dies klingt ähnlich wie die von Subversion bereitgestellte "externe" Unterstützung. Wir haben dies versucht und fanden es äußerst umständlich, die Versionsreferenzen in den externen Dateien ständig zu aktualisieren, da die Projekte gleichzeitig mit Abhängigkeiten voneinander entwickelt werden. Gibt es eine andere Option?
Paul Alexander
@Paul: Ja, anstatt die Version aus dem Hauptprojekt zu aktualisieren, entwickeln Sie Ihre Unterprojekte entweder direkt aus dem Hauptprojekt heraus (siehe stackoverflow.com/questions/1979167/git-submodule-update/… ) oder Sie verweisen in a Sub-Repo Ein Ursprung für dasselbe Sub-Repo, das an anderer Stelle entwickelt wird: Von dort aus müssen Sie nur die an anderer Stelle vorgenommenen Änderungen aus diesem Sub-Repo ziehen. In beiden Fällen müssen Sie nicht vergessen, das Hauptprojekt festzuschreiben, um die neue Konfiguration aufzuzeichnen. Keine "externe" Eigenschaft zum Aktualisieren. Der gesamte Prozess ist viel natürlicher.
VonC
3
@Paul: Ehrlich gesagt, Sie haben vielleicht Recht ... das ist bis zur letzten Git-Version 1.7.1. ( kernel.org/pub/software/scm/git/docs/RelNotes-1.7.1.txt ) git diffund git statusbeide lernten, Submodulzustände zu berücksichtigen, selbst wenn sie vom Hauptprojekt ausgeführt wurden. Sie können die Modifikation des Submoduls einfach nicht verpassen.
VonC
1
Bis @PaulAlexander etwas sagt, entscheide ich mich zu glauben, dass er jetzt tatsächlich Submodule verwendet.
Cregox
2

Mit GitSlave können Sie mehrere unabhängige Repos als eine verwalten. Jedes Repo kann mit regulären Git-Befehlen bearbeitet werden, während Sie mit Gitslave zusätzlich einen Befehl über alle Repos ausführen können.

super-repo
+- module-a-repo
+- module-b-repo

gits clone url-super-repo
gits commit -a -m "msg"

Repo-per-Project bietet Vorteile bei der Komponentisierung und vereinfachte Builds mit Tools wie Maven. Repo-per-Project bietet zusätzlichen Schutz, indem es den Umfang der Änderungen durch den Entwickler einschränkt - in Bezug auf fehlerhafte Commits von Müll.

Andre
quelle
Könnten Sie etwas über die Vor- und Nachteile des Submoduls gitslave vs. git sagen?
MM
1
Der große Vorteil von Gitslave ist, dass Ihre Git-Repos alleine stehen. Sie können Repos mit einfachen Git-Befehlen verwalten, ohne die Gitslave-Beziehung zu beeinflussen. Wenn Sie jedoch ein Tag beispielsweise über alle Repos hinweg ausführen möchten, kann Gitslave dies tun.
Andre
1
Das Submodul ist meiner Meinung nach mit Komplexität behaftet. Entwickler müssen es verstehen und eng damit arbeiten.
Andre