Git-Submodul vs Git-Klon

18

Ich arbeite an einem Open Source Projekt auf GitHub.

Es hat ein Unterverzeichnis / Vendor, in dem es eine Kopie mehrerer externer Bibliotheken hat. Der ursprüngliche Projektbetreuer hat dieses Verzeichnis von Zeit zu Zeit mit einer neueren Kopie der externen Bibliothek aktualisiert.

Ein Entwickler schickte mir eine Pull-Anfrage mit der Idee, diese Kopie durch ein Git-Submodul zu ersetzen .

Und ich überlege, ob es eine gute Idee ist oder nicht.

Git-Modul Vorteile:

  • Submodule wurden speziell für ähnliche Szenarien entwickelt
  • Dadurch wird die Möglichkeit eines versehentlichen Commits mit dem Anbieter beseitigt, das beim nächsten Update überschrieben wird

Git-Modul Nachteile:

  • Es sieht so aus, als ob Git-Submodule die Komplexität vom Betreuer auf eine Person verlagern, die das Projekt klonen / ziehen wird (zusätzliche Schritte nach dem Klonen erforderlich, um mit dem Projekt zu arbeiten: "Git-Submodul Init", "Git-Submodul Update"

Was ist deine Meinung dazu?

Eine Sache noch. Dieses Problem ist eine recht kleine Bibliothek mit sehr begrenzten externen Abhängigkeiten. Ich denke, jedes Build-Tool wäre für den Moment übertrieben.

Victor Ronin
quelle
4
Alternativ können git clone --recursiveund müssen sie die Befehle des Submoduls nicht ausführen. Niemand sonst hatte diesen Leckerbissen erwähnt; Die meisten Leute, die Submodule haben, machen dies in der README bekannt.
Levi Morrison

Antworten:

9

Eine Alternative zu einem Submodul ist die Verwendung git subtree. Dies bietet die Vorteile git submodule, ohne jedoch die Komplexität auf den Endbenutzer zu übertragen. Das Drittanbieter-Repository wird in der Hauptprojektstruktur zusammengeführt, es werden jedoch Metadaten so gespeichert, dass Sie:

  • extrahieren Sie das Third-Party-Repository später, wenn interessante Änderungen vorgenommen wurden
  • Zusammenführen neuer Updates aus dem Drittanbieter-Repository ( Zusammenführen von Notizen , nicht Überschreiben)

Für Git-Benutzer, die nicht über ausreichende Kenntnisse der Submodule verfügen, ist es mit dem Subtree-Ansatz nicht schwieriger, einen Klon Ihres Projekts zu erstellen als mit jedem anderen Klon. Ein kurzer Hinweis aus der Dokumentation:

Mit Unterbäumen können Teilprojekte in ein Unterverzeichnis des Hauptprojekts aufgenommen werden, optional einschließlich des gesamten Verlaufs des Teilprojekts.

Beispielsweise können Sie den Quellcode für eine Bibliothek als Unterverzeichnis Ihrer Anwendung einfügen.

Teilbäume sind nicht mit Teilmodulen zu verwechseln, die für die gleiche Aufgabe bestimmt sind. Im Gegensatz zu Submodulen müssen in Ihrem Repository keine speziellen Konstruktionen (wie .gitmodule-Dateien oder gitlinks) vorhanden sein, und die Endbenutzer Ihres Repositorys dürfen nicht gezwungen werden, etwas Besonderes zu tun oder die Funktionsweise von Subbäumen zu verstehen. Ein Teilbaum ist nur ein Unterverzeichnis, das Sie beliebig mit Ihrem Projekt verbinden, verzweigen und zusammenführen können.

Ich hatte ein Projekt bei der Arbeit mit Submodulen eingerichtet, und die Probleme, die Submodule in den Klonen aller auf dem neuesten Stand zu halten, waren zu viel Arbeit. Ich habe kürzlich die Verwendung von Teilbäumen überall geändert und diese Probleme sind verschwunden.

Beachten Sie, dass git-subtree Teil des git/contribVerzeichnisses ist und separat installiert werden muss.

Greg Hewgill
quelle
4

Ein Nachteil der Verwendung von Submodulen besteht darin, dass die Tarballs oder Zip-Archive von Github (und vielen anderen Diensten) keine Quellen für Submodule enthalten. Das heißt, die Archive sind nicht in sich geschlossen. Dies ist ein Problem, wenn das Repository klein ist und nicht wirklich über ein Erstellungsskript verfügt, wie z. B. eine statische HTML-Site, die von einer JavaScript-Bibliothek abhängt.

Lekensteyn
quelle
3

Dies ist ein idealer Ort, um Submodule zu verwenden. Sie reduzieren die Größe und Komplexität Ihres Repositorys und erleichtern das Aktualisieren der externen Bibliotheken auf eine neue Version.

Sie sind nicht schwer herauszufinden, wie man sie benutzt, und sie werden in dieser Situation ziemlich häufig verwendet. Notieren Sie sich daher in der README-Datei des Projekts, dass Sie Submodule verwenden und was zu tun ist, und die Leute sollten in der Lage sein, dies herauszufinden es raus. Als ich das erste Mal auf ein Repository mit einem Submodul gestoßen bin, habe ich es innerhalb von 10 bis 15 Minuten eingerichtet und hatte seitdem nie mehr Probleme, herauszufinden, was zu tun ist.

Jonathan Patt
quelle
1
Wenn Ihre Anwendung nicht initialisiert werden kann, möchten Sie möglicherweise überprüfen, ob das Submodul initialisiert wurde. Falls dies nicht der Fall ist, geben Sie eine freundliche Fehlermeldung aus.
Jonathan Rich
1
Siehe auch Lekensteyns Antwort zu Zip-Archiven ohne Submodul-Dateien. Dies bedeutet, dass Submodule möglicherweise nicht der beste Ansatz sind, wenn Sie Code öffentlich bereitstellen, aber für privaten Code, dessen Klonen garantiert ist, in Ordnung sind. Ansonsten lieber Teilbäume.
Ingenieur
3

Durch die Verwendung von Submodulen können Sie keine lokalen Änderungen am Code vornehmen und eine Abhängigkeit vom externen Repository herstellen. Wenn Sie sicher sind, dass Sie niemals eine Bibliothek anpassen oder lokale Fehlerbehebungen vornehmen möchten, und sicher sein können, dass der externe Server immer verfügbar ist, wenn Sie eine neue Kopie klonen möchten, sind Sie hier richtig.

Kurz gesagt - möchten Sie einfach die Bibliotheken verwenden oder betrachten Sie sie als Teil Ihrer Codebasis? Wenn sie nicht "Ihr" Code sind, warum befinden sie sich in der Versionskontrolle und nicht nur in etwas, das Sie für die Installation benötigen?

Sean McSomething
quelle
6
Submodule hindern Sie nicht daran, lokale Änderungen vorzunehmen. Im Gegenteil, sie ermöglichen es Ihnen, diese Änderungen zu verfolgen und verschiedene Versionen (Ihre Optimierungen oder Bibliotheksversionen) der Bibliothek in verschiedenen Projekten zu verwenden.
Steve Fallows