Wir verwenden Git-Submodule, um einige große Projekte zu verwalten, die von vielen anderen von uns entwickelten Bibliotheken abhängig sind. Jede Bibliothek ist ein separates Repo, das als Submodul in das abhängige Projekt gebracht wird. Während der Entwicklung möchten wir oft nur die neueste Version jedes abhängigen Submoduls herunterladen.
Hat git einen eingebauten Befehl, um dies zu tun? Wenn nicht, wie wäre es mit einer Windows-Batchdatei oder ähnlichem, die dies kann?
git
git-submodules
Brad Robinson
quelle
quelle
Antworten:
Wenn Sie zum ersten Mal ein Repo auschecken, müssen Sie es
--init
zuerst verwenden:Für Git 1.8.2 oder höher wurde die Option
--remote
hinzugefügt, um die Aktualisierung auf die neuesten Tipps für Remote-Zweige zu unterstützen:Dies hat den zusätzlichen Vorteil, dass alle in den
.gitmodules
oder.git/config
-Dateien angegebenen "Nicht-Standard" -Zweige berücksichtigt werden (wenn Sie zufällig einen haben, ist der Standard "Ursprung / Master". In diesem Fall würden auch einige der anderen Antworten hier funktionieren).Für Git 1.7.3 oder höher können Sie Folgendes verwenden (aber die folgenden Fallstricke zeigen an, welches Update noch gilt):
oder:
Wenn Sie Ihre Submodule auf die neuesten Commits anstatt auf das aktuelle Commit ziehen möchten, zeigt das Repo auf.
Siehe Git-Submodul (1) für Details
quelle
git submodule update --recursive
heutzutage verwenden.git submodule foreach "(git checkout master; git pull)&"
origin master
am Ende dieses Befehls zu unerwarteten Ergebnissen führen, wenn einige Ihrer Submodule einen anderen Zweig- oder Standortnamen dieses bestimmten Submoduls verfolgen. Für einige offensichtlich, aber wahrscheinlich nicht für alle.git submodule update --recursive
Prüft, welche Revision das übergeordnete Repository für jedes Submodul gespeichert hat, und überprüft dann diese Revision in jedem Submodul. Es werden NICHT die neuesten Commits für jedes Submodul abgerufen.git submodule foreach git pull origin master
odergit pull origin master --recurse-submodules
ist das, was Sie möchten, wenn Sie beabsichtigen, jedes Submodul aus seinen Ursprungs-Repositorys auf den neuesten Stand zu bringen. Nur dann erhalten Sie ausstehende Änderungen im übergeordneten Repo mit aktualisierten Revisions-Hashes für Submodule. Checken Sie diese ein und Sie sind gut.Bis der Fehler behoben ist, müssen Sie zum ersten Mal ausführen
quelle
git pull --recurse-submodules
nochgit submodule update --recursive
nicht nicht initialize neu Submodule hinzugefügt. Um sie zu initialisieren, müssen Sie ausführengit submodule update --recursive --init
. Zitat aus dem Handbuch : Wenn das Submodul noch nicht initialisiert ist und Sie nur die in .gitmodules gespeicherte Einstellung verwenden möchten, können Sie das Submodul automatisch mit der Option --init initialisieren.git submodule update --recursive --remote
der anstelle des gespeicherten SHA-1 auch die Submodule auf die neueste Remote-Version aktualisiert.Führen Sie auf init den folgenden Befehl aus:
funktioniert aus dem git repo verzeichnis am besten für mich.
Dadurch werden alle neuesten Modelle einschließlich Submodule abgerufen.
Erklärt
Danach können Sie einfach ausführen:
funktioniert aus dem git repo verzeichnis am besten für mich.
Dadurch werden alle neuesten Modelle einschließlich Submodule abgerufen.
quelle
Hinweis: Dies ist aus dem Jahr 2009 und war damals vielleicht gut, aber jetzt gibt es bessere Optionen.
Wir nutzen dies. Es heißt
git-pup
:Legen Sie es einfach in ein geeignetes bin-Verzeichnis (/ usr / local / bin). Unter Windows müssen Sie möglicherweise die Syntax ändern, damit es funktioniert :)
Aktualisieren:
Als Antwort auf den Kommentar des ursprünglichen Autors zum Einziehen aller KÖPFE aller Submodule - das ist eine gute Frage.
Ich bin mir ziemlich sicher, dass
git
es intern keinen Befehl dafür gibt. Dazu müssten Sie herausfinden, was HEAD wirklich für ein Submodul ist. Das könnte so einfach sein, als würde man sagen, esmaster
sei der aktuellste Zweig usw.Erstellen Sie anschließend ein einfaches Skript, das Folgendes ausführt:
git submodule status
nach "geänderten" Repositorys. Das erste Zeichen der Ausgabezeilen zeigt dies an. Wenn ein Sub-Repo geändert wird, möchten Sie möglicherweise NICHT fortfahren.git checkout master && git pull
. Auf Fehler prüfen.Ich möchte erwähnen, dass dieser Stil nicht wirklich das ist, wofür Git-Submodule entwickelt wurden. Normalerweise möchten Sie sagen, dass "LibraryX" die Version "2.32" hat und so bleibt, bis ich ihm sage, dass er "upgraden" soll.
In gewisser Weise machen Sie das mit dem beschriebenen Skript, aber nur automatischer. Vorsicht ist geboten!
Update 2:
Wenn Sie sich auf einer Windows-Plattform befinden, sollten Sie Python verwenden, um das Skript zu implementieren, da es in diesen Bereichen sehr leistungsfähig ist. Wenn Sie unter Unix / Linux arbeiten, empfehle ich nur ein Bash-Skript.
Benötigen Sie Klarstellungen? Schreibe einfach einen Kommentar.
quelle
git config --global alias.pup '!git pull && git submodule init && git submodule update && git submodule status'
und dann wiegit pup
ohne Scripting verwenden.git submodule init
nach dem ersten Pull mit Submodulen ausführen , damit alles richtig funktioniert.Henrik ist auf dem richtigen Weg. Der Befehl 'foreach' kann ein beliebiges Shell-Skript ausführen. Zwei Optionen, um die neuesten zu ziehen, könnten sein:
und,
Dadurch werden alle initialisierten Submodule durchlaufen und die angegebenen Befehle ausgeführt.
quelle
Folgendes hat bei mir unter Windows funktioniert.
quelle
Bearbeiten :
In den Kommentaren wurde (von philfreo ) darauf hingewiesen, dass die neueste Version erforderlich ist. Wenn verschachtelte Submodule in der neuesten Version vorhanden sein müssen:
----- Veralteter Kommentar unten -----
Ist das nicht der offizielle Weg, es zu tun?
Ich benutze es jedes Mal. Bisher keine Probleme.
Bearbeiten:
Ich habe gerade festgestellt, dass Sie verwenden können:
Dadurch werden auch alle Submodule, dh Abhängigkeiten, rekursiv abgerufen.
quelle
git submodule update --init --recursive
git submodule foreach --recursive git pull
Da es vorkommen kann, dass der Standardzweig Ihrer Submodule nicht
master
lautet, automatisiere ich auf diese Weise die vollständigen Git-Submodul-Upgrades:quelle
Erstes Mal
Submodul klonen und initialisieren
Sich ausruhen
Während der Entwicklung einfach das Submodul ziehen und aktualisieren
Aktualisieren Sie das Git-Submodul auf das neueste Commit für den Ursprung
Der bevorzugte Weg sollte unten sein
Hinweis: Die letzten beiden Befehle haben dasselbe Verhalten
quelle
git submodule update
Trick gemacht. Jetzt lade ich Submoduldaten herunter, die im ersten Schritt des Klons fehlen. Vielen Dank. Ich bin nicht gut in git: CIch weiß nicht, seit welcher Version von Git dies funktioniert, aber das ist es, wonach Sie suchen:
Ich benutze es auch
git pull
, um das Root-Repository zu aktualisieren:quelle
Die obigen Antworten sind gut, wir haben jedoch Git-Hooks verwendet, um dies zu vereinfachen. Es stellt sich jedoch heraus, dass Sie in Git 2.14
git config submodule.recurse
den Wert true festlegen können , damit Submodule aktualisiert werden können, wenn Sie in Ihr Git-Repository ziehen.Dies hat den Nebeneffekt, dass alle Änderungen an Submodulen, die Sie haben, verschoben werden, wenn sie sich in Zweigen befinden. Wenn Sie dieses Verhalten jedoch bereits benötigen, kann dies den Job erledigen.
Kann durchgeführt werden mit:
quelle
git submodule init
vorher verwenden, wenn Ihr Submodul noch nicht initialisiert ist.Git für Windows 2.6.3 :
git submodule update --rebase --remote
quelle
Von der obersten Ebene im Repo:
Dadurch werden alle Zweige auf die Entwicklung und den neuesten Stand umgestellt
quelle
git submodule foreach git pull origin master
Musste den Zweig anhängen, den ich holen wollte. ansonsten funktionierte perfekt.Ich habe dies getan , indem ich die Antwort von Gahooa oben angepasst habe :
Integriere es mit einem Git
[alias]
...Wenn Ihr übergeordnetes Projekt Folgendes hat
.gitmodules
:Fügen Sie so etwas in Ihre .gitconfig ein
Führen Sie dann zum Aktualisieren Ihrer Submodule Folgendes aus:
Ich habe ein Beispiel dafür in meinem Umgebungs-Setup-Repo .
quelle
Alles was Sie jetzt tun müssen, ist eine einfache
git checkout
Stellen Sie einfach sicher, dass Sie es über diese globale Konfiguration aktivieren:
git config --global submodule.recurse true
quelle
Hier ist die Befehlszeile, mit der Sie aus allen Git-Repositorys abrufen können, ob es sich um Submodule handelt oder nicht:
Wenn Sie es in Ihrem Top-git - Repository ausgeführt wird , können Sie ersetzen
"$ROOT"
in.
.quelle
Ich denke, Sie müssen ein Skript schreiben, um dies zu tun. Um ehrlich zu sein, könnte ich installieren Python es so zu tun , dass Sie verwenden können ,
os.walk
umcd
zu jedem Verzeichnis und die entsprechenden Befehle erteilen. Wenn Sie Python oder eine andere Skriptsprache als Batch verwenden, können Sie problemlos Unterprojekte hinzufügen / entfernen, ohne das Skript ändern zu müssen.quelle
Bemerkung: nicht allzu einfach, aber praktikabel und es hat seine eigenen einzigartigen Profis.
Wenn man nur die
HEAD
Revision eines Repositorys und nurHEAD
s aller seiner Submodule klonen möchte (dh "Trunk" auschecken), kann man das folgende Lua- Skript verwenden. Manchmalgit submodule update --init --recursive --remote --no-fetch --depth=1
kann ein einfacher Befehl zu einem nicht behebbarengit
Fehler führen. In diesem Fall muss das Unterverzeichnis des.git/modules
Verzeichnisses bereinigt und das Submodul manuell mit demgit clone --separate-git-dir
Befehl geklont werden . Die einzige Komplexität besteht darin, die URL , den Pfad des.git
Verzeichnisses des Submoduls und den Pfad des Submoduls im Superprojektbaum herauszufinden .Anmerkung: Das Skript wird nur gegen das
https://github.com/boostorg/boost.git
Repository getestet . Seine Besonderheiten: Alle Submodule werden auf demselben Host gehostet und.gitmodules
enthalten nur relative URLs .quelle