Sie sollten darauf achten, explizit zu notieren, wovon Sie sprechen, wenn Sie den Begriff "Teilbaum" im Zusammenhang mit verwenden, git
da es hier tatsächlich zwei separate, aber verwandte Themen gibt:
git-subtree und git subtree verschmelzen Strategie .
Die TL; DR
Mit beiden Teilbaumkonzepten können Sie effektiv mehrere Repositorys in einem verwalten. Im Gegensatz zu git-submodule, bei dem nur Metadaten in Form von .gitmodules im Root-Repository gespeichert sind und Sie die externen Repositorys separat verwalten müssen.
Mehr Details
Die Strategie zum Zusammenführen von Git-Teilbäumen ist im Grunde die manuellere Methode, bei der die von Ihnen referenzierten Befehle verwendet werden.
git-subtree ist ein Wrapper-Shell-Skript, um eine natürlichere Syntax zu ermöglichen. Dies ist eigentlich immer noch ein Teil von contrib
und nicht vollständig in Git mit den üblichen Manpages integriert. Die Dokumentation wird stattdessen neben dem Skript gespeichert.
Hier sind die Nutzungsinformationen:
NAME
----
git-subtree - Merge subtrees together and split repository into subtrees
SYNOPSIS
--------
[verse]
'git subtree' add -P <prefix> <commit>
'git subtree' add -P <prefix> <repository> <ref>
'git subtree' pull -P <prefix> <repository> <ref>
'git subtree' push -P <prefix> <repository> <ref>
'git subtree' merge -P <prefix> <commit>
'git subtree' split -P <prefix> [OPTIONS] [<commit>]
Ich bin auf eine ziemlich große Anzahl von Ressourcen zum Thema Teilbäume gestoßen, als ich vorhatte, einen eigenen Blog-Beitrag zu schreiben. Ich werde diesen Beitrag aktualisieren, wenn ich dies tue, aber im Moment sind hier einige relevante Informationen zu der vorliegenden Frage:
Vieles von dem, was Sie suchen, finden Sie in diesem Atlassian-Blog von Nicola Paolucci im entsprechenden Abschnitt unten:
Warum Teilbaum anstelle von Submodul verwenden?
Es gibt mehrere Gründe, warum Sie eine subtree
bessere Verwendung finden könnten :
- Die Verwaltung eines einfachen Workflows ist einfach.
- Ältere Versionen von
git
werden unterstützt (auch vorher v1.5.2
).
- Der Code des Unterprojekts ist direkt nach Abschluss
clone
des Superprojekts verfügbar .
subtree
Die Benutzer Ihres Repositorys müssen nichts Neues lernen. Sie können die Tatsache ignorieren, dass Sie subtree
Abhängigkeiten verwalten.
subtree
fügt keine neuen Metadatendateien wie submodules
(dh
.gitmodule
) hinzu.
- Der Inhalt des Moduls kann geändert werden, ohne dass an anderer Stelle eine separate Repository-Kopie der Abhängigkeit vorhanden ist.
Meiner Meinung nach sind die Nachteile akzeptabel:
- Sie müssen sich über eine neue Zusammenführungsstrategie (dh
subtree
) informieren .
- Das Zurückgeben von Code
upstream
für die Teilprojekte ist etwas komplizierter.
- Die Verantwortung, Super- und Teilprojektcode nicht in Commits zu mischen, liegt bei Ihnen.
Ich würde auch vielem zustimmen. Ich würde empfehlen, den Artikel zu lesen, da er einige häufig verwendete Begriffe behandelt.
Sie haben vielleicht bemerkt, dass er hier auch ein Follow-up geschrieben hat, in dem er ein wichtiges Detail erwähnt, das bei diesem Ansatz weggelassen wird ...
git-subtree
Derzeit ist die Fernbedienung nicht enthalten!
Diese Kurzsichtigkeit ist wahrscheinlich auf die Tatsache zurückzuführen, dass Benutzer beim Umgang mit Teilbäumen häufig manuell eine Fernbedienung hinzufügen, diese wird jedoch auch nicht in git gespeichert. Der Autor beschreibt einen Patch, den er geschrieben hat, um diese Metadaten zu dem git-subtree
bereits generierten Commit hinzuzufügen . Bis dies in die offizielle Git-Hauptzeile gelangt, können Sie etwas Ähnliches tun, indem Sie die Commit-Nachricht ändern oder in einem anderen Commit speichern.
Ich finde diesen Blog-Beitrag auch sehr informativ. Der Autor fügt git-stree
der Mischung eine dritte Teilbaummethode hinzu, die er aufruft . Der Artikel ist eine Lektüre wert, da er die drei Ansätze ziemlich gut vergleicht. Er gibt seine persönliche Meinung darüber ab, was er tut und was nicht und erklärt, warum er den dritten Ansatz entwickelt hat.
Extras
Gedanken schließen
Dieses Thema zeigt sowohl die Leistung git
als auch die Segmentierung, die auftreten kann, wenn ein Feature nur die Marke verfehlt.
Ich persönlich habe eine Abneigung gegen das aufgebaut, git-submodule
was ich für Mitwirkende verwirrender finde. Ich bevorzuge es auch, ALLE meine Abhängigkeiten in meinen Projekten zu verwalten, um eine leicht reproduzierbare Umgebung zu ermöglichen, ohne zu versuchen, mehrere Repositorys zu verwalten. git-submodule
Allerdings ist es derzeit viel bekannter, daher ist es offensichtlich gut, sich dessen bewusst zu sein und abhängig von Ihrem Publikum, das Ihre Entscheidung beeinflussen kann.