Unterschiede zwischen Git-Submodul und Subbaum


300

Was sind die konzeptionellen Unterschiede zwischen der Verwendung des Git-Submoduls und des Subbaums?

Was sind die typischen Szenarien für jedes?


3
Dies beantwortet möglicherweise nicht alle Ihre Fragen, ist aber eine interessante Lektüre zu diesem Thema: blogs.atlassian.com/2013/05/…
Chop


"Alternativen zu Git-Submodulen?": Stackoverflow.com/questions/6500524/…
brillout

Antworten:


177

Was ist, wenn die Links immer auf den KOPF des externen Repos verweisen sollen?

Sie können ein Submodul so erstellen, dass es dem KOPF eines Zweigs eines Remote-Repos eines Submoduls folgt:

Ö git submodule add -b <branch> <repository> [<path>] . (um einen Zweig anzugeben, dem gefolgt werden soll)
o git submodule update --remoteder den Inhalt des Submoduls <repository>/<branch>standardmäßig auf den neuesten HEAD von aktualisiert origin/master. Ihr Hauptprojekt verfolgt weiterhin die Hashes des HEAD des Submoduls, auch wenn --remotees verwendet wird.



Ihre Antwort scheint gegen die abgestimmte Antwort hier zu verstoßen
Nathan H

@ NathanH this (die Möglichkeit, HEAD zu verfolgen) wurde ein Jahr später hinzugefügt (März 2013, git 1.8.2: github.com/git/git/blob/… )
VonC

Ich sehe, dass das Submodul-Followship-Verhalten auch in Ihrer anderen Antwort erwähnt wird . In diesem Fall möchten Sie damit sagen, dass das Zeigen auf den KOPF eines Submoduls erreicht wird, indem beide add -bund --remotedanach die Aktualisierungsbefehle gemäß der Dokumentation zur Aktualisierung des Submoduls verwendet werden . Ist in diesem Fall das -bwirklich noch erforderlich, um dem HEAD of Master zu folgen?
Matanster

@matt the -bwird verwendet, um die richtigen .gitmodule-Metadaten für das Submodul zu generieren (entspricht a git config -f .gitmodules submodule.<path>.branch <branch>).
VonC

Dann hat es wenig mit Aktivieren zu tun --remote- --remotefunktioniert auch, wenn -bes nicht verwendet wurde add. In beiden Fällen führt das Update zu einem Commit im übergeordneten Repo, in dem sich das Submodul befindet, sodass die Links nicht wirklich "immer auf den HEAD verweisen" - entweder habe ich es nicht verstanden oder diese Behauptung besser aus der ursprünglichen Antwort (?) entfernt werden
Matanster


121

Der konzeptionelle Unterschied ist:

Mit Git-Submodulen möchten Sie normalerweise ein großes Repository in kleinere trennen. Die Referenzierung eines Submoduls erfolgt im Maven-Stil Sie verweisen auf ein einzelnes Commit aus dem anderen Repository (Submodul). Wenn Sie eine Änderung innerhalb des Submoduls benötigen, müssen Sie ein Commit / Push innerhalb des Submoduls vornehmen, dann auf das neue Commit im Hauptrepository verweisen und dann die geänderte Referenz des Hauptrepositorys festschreiben / pushen. Auf diese Weise müssen Sie für den gesamten Build Zugriff auf beide Repositorys haben.

Mit git subree integrieren Sie ein weiteres Repository in Ihr Repository, einschließlich seines Verlaufs. Nach der Integration ist die Größe Ihres Repositorys wahrscheinlich größer (dies ist also keine Strategie, um die Repositorys kleiner zu halten). Nach der Integration besteht keine Verbindung zum anderen Repository, und Sie benötigen keinen Zugriff darauf, es sei denn, Sie möchten ein Update erhalten. Diese Strategie ist also eher für die Wiederverwendung von Code und Verlauf gedacht - ich persönlich verwende sie nicht.


Aber mit git subtreedir kannst du trotzdem noch pushen - wenn du willst - oder?
Ixx

@lxx Wenn Sie die Repository-URL kennen ...
Franklin Yu

@FranklinYu Warum sollte er das nicht wissen? Kannst du diese Informationen nicht aus den lokalen Git-Metadaten erhalten?
adi518

@ adi518 Ja, wenn Sie derjenige sind, der den Teilbaum erstellt hat. Wenn Sie jedoch Ihr Repository auf GitHub verschoben haben und andere es nach unten klonen, kennt er die Teilbaum-URL nicht automatisch.
Franklin Yu

@NiklasP - Können Sie näher auf "Verweisen auf das neue Commit im Haupt-Repository" eingehen? Das ist der eine Schritt, bei dem mir nicht klar ist, wie ich ihn ausführen soll, und daher verstehe ich auch "geänderte Referenz" nicht.
Robert Oschler

21

Das Submodul
, das ein Haupt-Repo auf eine Fernbedienung überträgt, überträgt die Dateien des Submoduls nicht

Unterbaum
, der ein Haupt-Repo auf Remote überträgt, schiebt die Dateien des Unterbaums


3
"Wenn Sie ein Haupt-Repo auf Remote übertragen, werden die Dateien des Unterbaums verschoben." Nein, das ist nicht der Fall.
J Bramble

@JBramble Ich sollte wahrscheinlich erwähnen, dass es mit der SourceTree-App gemacht wird, zB:git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree push -v --tags production refs/heads/master:refs/heads/master
Maciek Rek
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.