Mir ist nicht klar, was Folgendes bedeutet (aus der Dokumentation zum Git-Submodul-Update ):
... wird die Submodule HEAD abgelöst machen, es sei denn
--rebase
oder--merge
angegeben ist ...
Wie funktioniert --rebase
/ --merge
Dinge ändern?
Mein Hauptanwendungsfall besteht darin, eine Reihe zentraler Repositorys zu haben, die ich über Submodule in andere Repositorys einbetten werde. Ich möchte in der Lage sein, diese zentralen Repositorys entweder direkt an ihrem ursprünglichen Speicherort oder innerhalb ihrer eingebetteten Repositorys (die sie über das Submodul verwenden) zu verbessern.
- Kann ich innerhalb dieser Submodule Zweige / Änderungen erstellen und Push / Pull wie in normalen Repositorys verwenden, oder gibt es Dinge, bei denen ich vorsichtig sein muss?
- Wie würde ich das Submodul-referenzierte Commit von beispielsweise (markiert) 1.0 auf 1.1 vorrücken (obwohl der Kopf des ursprünglichen Repositorys bereits auf 2.0 steht) oder auswählen, welches Commit des Zweigs überhaupt verwendet wird?
git
git-submodules
tiefes Blau
quelle
quelle
Antworten:
Diese GitPro-Seite fasst die Konsequenzen eines Git-Submodul-Updates gut zusammen
Anmerkung März 2013:
Wie unter " Neueste Verfolgung des Git-Submoduls " erwähnt, kann ein Submodul jetzt (git1.8.2) einen Zweig verfolgen.
Siehe "
git submodule update --remote
vsgit pull
".Die Antwort von MindTooth zeigt ein manuelles Update (ohne lokale Konfiguration):
In beiden Fällen werden dadurch die Submodulreferenzen (der Gitlink , ein spezieller Eintrag im übergeordneten Repo-Index ) geändert , und Sie müssen diese Referenzen aus dem Haupt-Repo hinzufügen, festschreiben und verschieben.
Wenn Sie das nächste Mal dieses übergeordnete Repo klonen, werden die Submodule gefüllt, um diese neuen SHA1-Referenzen wiederzugeben.
Der Rest dieser Antwort beschreibt die klassische Submodul-Funktion (Verweis auf ein festes Commit, das der springende Punkt hinter dem Begriff eines Submoduls ist).
Um Ihre Fragen zu beantworten:
Sie können einen Zweig erstellen und Änderungen vornehmen.
WARNUNG (aus dem Git-Submodul-Tutorial ): Veröffentlichen (pushen) Sie immer die Submoduländerung, bevor Sie die Änderung in dem Superprojekt veröffentlichen (pushen), das darauf verweist. Wenn Sie vergessen, die Änderung des Submoduls zu veröffentlichen, können andere das Repository nicht klonen.
Die Seite " Grundmodule verstehen " kann helfen
Diese zusammen triangulieren eine bestimmte Revision eines bestimmten Repositorys, die an einem bestimmten Ort in Ihrem Projekt ausgecheckt wird.
Von der Git-Submodul-Seite
100% korrekt: Sie können ein Submodul nicht ändern, sondern nur auf einen seiner Commits verweisen.
Wenn Sie ein Submodul innerhalb des Hauptprojekts ändern, haben Sie folgende Gründe:
Ein Submodul ermöglicht Ihnen eine komponentenbasierte Ansatzentwicklung , bei der sich das Hauptprojekt nur auf bestimmte Commits anderer Komponenten bezieht (hier "andere Git-Repositorys, die als Submodule deklariert sind").
Ein Submodul ist ein Marker (Commit) für ein anderes Git-Repository, das nicht an den Hauptprojektentwicklungszyklus gebunden ist: Es (das "andere" Git-Repo) kann sich unabhängig voneinander entwickeln.
Es ist Sache des Hauptprojekts, aus dem anderen Repo das Commit auszuwählen, das es benötigt.
Allerdings sollten Sie wollen, aus Bequemlichkeit , modifizieren eines dieses Submodule direkt von Ihrem Hauptprojekt ermöglicht Git Sie das zu tun, vorausgesetzt , Sie zuerst diese Submodul Änderungen an den ursprünglichen Git Repo veröffentlichen und dann Hauptprojekt übertragen beziehen zu eine neue Version des Submoduls.
Die Hauptidee bleibt jedoch: Verweisen auf bestimmte Komponenten, die:
Die Liste der spezifischen Commits, auf die Sie sich in Ihrem Hauptprojekt beziehen, definiert Ihre Konfiguration ( darum geht es bei Configuration Management, nur um das Versionskontrollsystem ).
Wenn eine Komponente wirklich zur gleichen Zeit wie Ihr Hauptprojekt entwickelt werden könnte (da jede Änderung am Hauptprojekt das Ändern des Unterverzeichnisses beinhalten würde und umgekehrt), wäre es kein "Submodul" mehr, sondern ein Teilbaumzusammenführung (auch in der Frage Übertragen der Legacy-Codebasis von Lebensläufen in ein verteiltes Repository dargestellt ), die den Verlauf der beiden Git-Repos miteinander verknüpft.
Hilft das, die wahre Natur von Git-Submodulen zu verstehen?
quelle
svn:externals
.git submodule foreach
Um jedes Submodul zu aktualisieren, können Sie den folgenden Befehl (im Stammverzeichnis des Repositorys) aufrufen:
Sie können die Option -q entfernen , um den gesamten Vorgang zu verfolgen.
quelle
git submodule update --init --recursive
vom Stamm ausführen , werden alle rekursiv abgerufen und initialisiert, sofern dies noch nicht geschehen ist.git submodule update --rebase --remote
So adressieren Sie die Option
--rebase
vs.--merge
Angenommen, Sie haben Super-Repository A und Submodul B und möchten einige Arbeiten in Submodul B ausführen. Sie haben Ihre Hausaufgaben gemacht und wissen das nach dem Aufruf
git submodule update
Sie befinden sich in einem Zustand ohne KOPF, daher ist es schwierig, auf Commits zurückzugreifen, die Sie zu diesem Zeitpunkt ausführen. Sie haben also mit der Arbeit an einem neuen Zweig in Submodul B begonnen
In der Zwischenzeit hat jemand anderes in Projekt A entschieden, dass die neueste und beste Version von B wirklich das ist, was A verdient. Aus Gewohnheit führen Sie die letzten Änderungen zusammen und aktualisieren Ihre Submodule.
Oh nein! Sie sind wieder in einem kopflosen Zustand, wahrscheinlich weil B jetzt auf die SHA zeigt, die mit dem neuen Tipp von B oder einem anderen Commit verbunden ist. Wenn Sie nur hätten:
Jetzt wurde die beste Idee für B auf das neue Commit übertragen, und was noch wichtiger ist, Sie befinden sich immer noch in Ihrem Entwicklungszweig für B, nicht in einem kopflosen Zustand!
(
--merge
Dadurch werden Änderungen von beforeUpdateSHA zu afterUpdateSHA in Ihrem Arbeitszweig zusammengeführt, anstatt Ihre Änderungen auf afterUpdateSHA neu zu gründen.)quelle
Git 1.8.2 bietet eine neue Option,
--remote
die genau dieses Verhalten ermöglicht. Laufenruft die neuesten Änderungen von Upstream in jedem Submodul ab, stützt sie neu und überprüft die neueste Version des Submoduls. Wie die Dokumentation es ausdrückt:
Dies entspricht der Ausführung
git pull
in jedem Submodul, was im Allgemeinen genau das ist, was Sie wollen.(Dies wurde aus dieser Antwort kopiert .)
quelle