Was sind die konzeptionellen Unterschiede zwischen der Verwendung des Git-Submoduls und des Subbaums?
Was sind die typischen Szenarien für jedes?
git
git-submodules
git-subtree
Nathan H.
quelle
quelle
Antworten:
Sie behalten nur Referenzen in Ihrem Eltern-Repo ( Gitlinks , spezielle Einträge im Index )
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 --remote
der den Inhalt des Submoduls<repository>/<branch>
standardmäßig auf den neuesten HEAD von aktualisiertorigin/master
. Ihr Hauptprojekt verfolgt weiterhin die Hashes des HEAD des Submoduls, auch wenn--remote
es verwendet wird.Siehe ein Beispiel in dieser Antwort .
quelle
add -b
und--remote
danach die Aktualisierungsbefehle gemäß der Dokumentation zur Aktualisierung des Submoduls verwendet werden . Ist in diesem Fall das-b
wirklich noch erforderlich, um dem HEAD of Master zu folgen?-b
wird verwendet, um die richtigen .gitmodule-Metadaten für das Submodul zu generieren (entspricht agit config -f .gitmodules submodule.<path>.branch <branch>
).--remote
---remote
funktioniert auch, wenn-b
es nicht verwendet wurdeadd
. 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 werdenSubmodul ist Link;
Teilbaum ist Kopie
quelle
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.
quelle
git subtree
dir kannst du trotzdem noch pushen - wenn du willst - oder?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
quelle
git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree push -v --tags production refs/heads/master:refs/heads/master