2628 Stimmen

Einfacher Weg, die aktuellsten aller Git-Submodule zu ziehen

Wir verwenden Git-Submodule, um einige große Projekte zu verwalten, die von vielen anderen Bibliotheken, die wir entwickelt haben, abhängig sind. Jede Bibliothek ist ein separates Repo, das als Submodul in das abhängige Projekt eingebracht wird. Während der Entwicklung wollen wir oft einfach die neueste Version jedes abhängigen Submoduls holen.

Verfügt Git über einen eingebauten Befehl, um dies zu tun? Wenn nicht, wie wäre es dann mit einer Windows-Batch-Datei oder ähnlichem, die das erledigen kann?

0 Stimmen

git-deep sollte dabei helfen.

17 Stimmen

@Brad wollen Sie Ihre Kopien von Submodulen auf die im Master-Projekt genannten Commit-Revs aktualisieren oder wollen Sie den letzten HEAD-Commit von jedem Submodul ziehen? Die meisten Antworten hier beziehen sich auf Ersteres; viele Leute wollen Letzteres.

1 Stimmen

Sie können diese Antwort mit Git flow with submodules hilfreich finden stackoverflow.com/a/70910397/9566462

722voto

Alexander Bartosh Punkte 7681
git pull --recurse-submodules --jobs=10

eine Funktion, die Git erst in Version 1.8.5 erlernt hat.

Bis die Fehler behoben ist, müssen Sie zum ersten Mal

git submodule update --init --rekursiv

35 Stimmen

Upvoted, ich benutze dies: alias update_submodules='git pull --recurse-submodules && git submodule update'

4 Stimmen

Dies funktioniert, wenn die Submodule bereits mindestens einmal ausgecheckt wurden, aber für Submodule, die noch nie ausgecheckt wurden, siehe die Antwort von gahooa unten.

11 Stimmen

Es wird bis zu der Version gezogen, die das TopRepo angibt; es wird NICHT HEAD gezogen. Wenn z.B. TopRepo eine Version angibt, die 2 hinter HEAD für SubRepo liegt, wird SubRepo mit der Version gezogen, die 2 dahinter liegt. Andere Antworten hier ziehen HEAD in SubRepo.

326voto

gahooa Punkte 121696

Hinweis: Dies ist aus dem Jahr 2009 und mag damals gut gewesen sein, aber heute gibt es bessere Möglichkeiten.

Wir verwenden dies. Es heißt git-pup :

#!/bin/bash
# Exists to fully update the git repo that you are sitting in...

git pull && git submodule init && git submodule update && git submodule status

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 :)

Aktualisierung:

Als Antwort auf den Kommentar des ursprünglichen Autors über das Einziehen aller HEADs aller Submodule - das ist eine gute Frage.

Ich bin mir ziemlich sicher, dass git verfügt intern nicht über einen Befehl für diesen Zweck. Um dies zu tun, müssten Sie festlegen, was HEAD für ein Submodul wirklich ist. Das könnte so einfach sein wie zu sagen master der aktuellste Zweig ist usw...

Erstellen Sie daraufhin ein einfaches Skript, das Folgendes tut:

  1. siehe git submodule status für "geänderte" Repositories. Das erste Zeichen in den Ausgabezeilen zeigt dies an. Wenn ein Unter-Repository geändert wurde, sollten Sie NICHT fortfahren.
  2. für jedes aufgelistete Repo in dessen Verzeichnis und führen Sie git checkout master && git pull . Prüfen Sie auf Fehler.
  3. Ich schlage vor, dass Sie am Ende eine Anzeige für den Benutzer ausgeben, um den aktuellen Status der Untermodule anzuzeigen - vielleicht fordern Sie ihn auf, alle hinzuzufügen und zu übertragen?

Ich möchte erwähnen, dass diese Art von Submodulen nicht wirklich für Git konzipiert wurde. Normalerweise möchte man sagen, dass "LibraryX" die Version "2.32" hat und diese beibehalten wird, bis ich ihr sage, dass sie "upgraden" soll.

Das ist in gewissem Sinne das, was Sie mit dem beschriebenen Skript tun, nur eben automatischer. Vorsicht ist geboten!

Update 2:

Wenn Sie mit einer Windows-Plattform arbeiten, sollten Sie vielleicht Python für die Implementierung des Skripts verwenden, da es in diesen Bereichen sehr leistungsfähig ist. Wenn Sie unter Unix/Linux arbeiten, empfehle ich Ihnen ein Bash-Skript.

Brauchen Sie Klarstellungen? Schreiben Sie einfach einen Kommentar.

0 Stimmen

Ich glaube nicht, dass ich das will. Würde das nicht die Version der Untermodule ziehen, mit der das Superprojekt zuletzt übertragen wurde? Ich möchte die Hauptversion aller Untermodule abrufen.

3 Stimmen

Das funktioniert nicht nur, um die Untermodule zu aktualisieren, sondern auch, um sie zum ersten Mal abzurufen, falls Sie das brauchen.

1 Stimmen

Ich erhalte nur die Meldung "Es gibt keine Tracking-Informationen für den aktuellen Zweig. Bitte geben Sie an, mit welchem Zweig Sie zusammenführen möchten." Egal, was ich versuche :/

151voto

zachleat Punkte 3268

Die folgende Vorgehensweise hat bei mir unter Windows funktioniert.

git submodule init
git submodule update

8 Stimmen

Dies ist eindeutig nicht das, wonach der Auftraggeber gefragt hat. Es wird nur auf den zugehörigen Submodul-Commit aktualisiert und nicht auf den neuesten.

52 Stimmen

Dies ist jedoch die einzige Sache auf dieser Seite, die Git dazu brachte, Submodule zu ziehen, als ich das erste Mal ein Repo auscheckte

2 Stimmen

Kann auch verwendet werden: git submodule update --init --recursive (vor allem, wenn das betreffende Submodul RestKit von einem frischen Klon ist)

50voto

Francis Bacon Punkte 2754

Für mich, git 2.24.03, wird auf die letzte Übertragung der entfernten Zweige aktualisiert, die in .gitmodules .

git submodule update --recursive --init

git submodule update --recursive --remote

git Version 2.24.3 (Apple Git-128)

Bitte beachten: Jemand sagte, dass git pull --recurse-submodules ist dasselbe wie git submodule update --recursive --remote . Aber von meinem Test, git pull --recurse-submodules wird möglicherweise nicht auf die letzte Übertragung der entfernten Zweige aktualisiert, die in .gitmodules .

0 Stimmen

Wissen Sie, warum der 2. Befehl mit --remote benötigt wird?

41voto

antitoxic Punkte 3666

bearbeiten :

In den Kommentaren wurde darauf hingewiesen (von philfreo ), dass die neueste Version erforderlich ist. Wenn es verschachtelte Submodule gibt, die in ihrer neuesten Version sein müssen:

git submodule foreach --recursive git pull

-----Aktueller Kommentar unten-----

Ist das nicht die offizielle Vorgehensweise?

git submodule update --init

Ich benutze sie jedes Mal. Bis jetzt keine Probleme.

Bearbeiten:

Ich habe gerade herausgefunden, dass man das verwenden kann:

git submodule foreach --recursive git submodule update --init 

Dadurch werden auch alle Untermodule, d.h. Abhängigkeiten, rekursiv gezogen.

5 Stimmen

Ihre Antwort beantwortet nicht die Frage des Auftraggebers, aber um das zu tun, was Sie vorgeschlagen haben, können Sie einfach sagen git submodule update --init --recursive

2 Stimmen

Ich verstehe, die neueste Version wird benötigt. Nun, dies könnte nützlich sein, wenn es verschachtelte Submodule gibt: git submodule foreach --recursive git pull

1 Stimmen

Ich konnte keine dieser Dateien tatsächlich herunterladen - "git submodule update --init --recursive" funktionierte bei mir jedoch.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X