Frage Einfache Möglichkeit, die neuesten Git Submodule zu ziehen


Wir verwenden git-Submodule, um einige große Projekte zu verwalten, die Abhängigkeiten von vielen anderen Bibliotheken haben, die wir entwickelt haben. Jede Bibliothek ist ein separater Repo, der als Submodul in das abhängige Projekt eingebracht wird. Während der Entwicklung möchten wir oft nur die neueste Version jedes abhängigen Submoduls abrufen.

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


1372
2018-06-23 01:05


Ursprung


Antworten:


Zum Git 1.8.2 oder über der Option --remote wurde hinzugefügt, um die Aktualisierung auf die neuesten Tipps von entfernten Niederlassungen zu unterstützen:

git submodule update --recursive --remote

Dies hat den zusätzlichen Vorteil, dass alle "nicht standardmäßigen" Zweige, die in der .gitmodules oder .git/config Dateien (falls Sie welche haben, ist der Standard Ursprung / Master, in diesem Fall würden einige der anderen Antworten auch hier funktionieren).

Zum Git 1.7.3 oder höher, die Sie verwenden können (aber die unten stehenden Hinweise, welches Update noch zutrifft):

git submodule update --recursive

oder:

git pull --recurse-submodules

Wenn Sie Ihre Submodule auf die letzten Commits ziehen möchten, auf die das Repo verweist.

Hinweis: Wenn das ist das erste Mal Sie checken ein Repo aus, das Sie verwenden müssen --init zuerst:

git submodule update --init --recursive

Zum älter, git 1.6.1 oder darüber können Sie etwas Ähnliches verwenden (entsprechend angepasst):

git submodule foreach git pull origin master

Sehen Git-Submodul (1) für Details


1748
2018-06-23 13:42



Wenn Sie Zeug für Submodule in Ihre Submodul-Repositories ziehen müssen, verwenden Sie

git pull --recurse-submodules

ein Feature git, das zuerst in 1.7.3 gelernt wurde.

Dies führt jedoch nicht dazu, dass die korrekten Commits (auf die Ihr Master-Repository verweist) in Submodulen ausgetestet werden

Um die korrekten Commits in Ihren Submodulen auszuprobieren, sollten Sie diese nach dem Ziehen aktualisieren

git submodule update --recursive --remote

567
2017-11-10 18:07



Hinweis: Dies ist von 2009 und vielleicht war es damals gut, aber es gibt jetzt bessere Möglichkeiten.

Wir benutzen das. 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 Verzeichnis (/ usr / local / bin). Wenn Sie unter Windows arbeiten, müssen Sie möglicherweise die Syntax ändern, damit es funktioniert :)

Aktualisieren:

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 git hat dafür intern keinen Befehl. Um dies zu tun, müssten Sie identifizieren, was HEAD wirklich für ein Submodul ist. Das könnte so einfach sein wie gesagt master ist die aktuellste Branche, etc ...

Erstellen Sie anschließend ein einfaches Skript, das Folgendes ausführt:

  1. prüfen git submodule status für "modifizierte" Repositories. Das erste Zeichen der Ausgabezeilen zeigt dies an. Wenn ein Unter-Repo geändert wird, möchten Sie möglicherweise nicht fortfahren.
  2. Für jeden aufgelisteten Repo cd in sein Verzeichnis und ausführen git checkout master && git pull. Auf Fehler prüfen.
  3. Am Ende, schlage ich vor, Sie drucken eine Anzeige an den Benutzer, um den aktuellen Status der Submodule anzuzeigen - vielleicht aufgefordert sie alle hinzuzufügen und zu verpflichten?

Ich möchte erwähnen, dass dieser Stil nicht wirklich das ist, wofür Git Submodulen entwickelt wurden. Normalerweise möchten Sie sagen, dass "LibraryX" die Version "2.32" hat und so bleiben wird, bis ich "upgrade" sage.

Das ist in gewissem Sinne, was Sie mit dem beschriebenen Skript machen, aber nur mehr automatisch. Sorgfalt ist erforderlich!

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 sind, schlage ich nur ein Bash-Skript vor.

Brauchen Sie irgendwelche Klarstellungen? Schreib einfach einen Kommentar.


295
2018-06-23 01:50



Bei der Ausführung des folgenden Befehls:

git submodule update --init --recursive

aus dem git repo-Verzeichnis, funktioniert am besten für mich.

Dies wird alle neuesten einschließlich Submodule ziehen.

Erklärt

git - the base command to perform any git command
    submodule - Inspects, updates and manages submodules.
        update - Update the registered submodules to match what the superproject
        expects by cloning missing submodules and updating the working tree of the
        submodules. The "updating" can be done in several ways depending on command
        line options and the value of submodule.<name>.update configuration variable.
            --init without the explicit init step if you do not intend to customize
            any submodule locations.
            --recursive is specified, this command will recurse into the registered
            submodules, and update any nested submodules within.

Danach können Sie einfach ausführen:

git submodule update --recursive

aus dem git repo-Verzeichnis, funktioniert am besten für mich.

Dies wird alle neuesten einschließlich Submodule ziehen.

Erklärt

git - the base command to perform any git command
    submodule - Inspects, updates and manages submodules.
        update - Update the registered submodules to match what the superproject
        expects by cloning missing submodules and updating the working tree of the
        submodules. The "updating" can be done in several ways depending on command
        line options and the value of submodule.<name>.update configuration variable.
            any submodule locations.
            --recursive is specified, this command will recurse into the registered
            submodules, and update any nested submodules within.

289
2017-12-11 19:38



Henrik ist auf dem richtigen Weg. Der Befehl 'foreach' kann jedes beliebige Shell-Skript ausführen. Zwei Möglichkeiten, um das Allerletzte zu ziehen, sind:

git submodule foreach git pull origin master

und,

git submodule foreach /path/to/some/cool/script.sh

Das wird alle durchlaufen initialisiert Submodule und führen Sie die angegebenen Befehle aus.


151
2018-06-23 14:21



Folgendes funktionierte für mich unter Windows.

git submodule init
git submodule update

138
2017-07-22 13:12



Bearbeiten:

In den Kommentaren wurde darauf hingewiesen (durch philfreo ) dass die neueste Version benötigt wird. Wenn verschachtelte Submodule vorhanden sind, die in ihrer neuesten Version sein müssen:

git submodule foreach --recursive git pull

----- Veralteter Kommentar unten -----

Ist das nicht der offizielle Weg?

git submodule update --init

Ich benutze es jedes Mal. Keine Probleme bisher.

Bearbeiten:

Ich habe gerade festgestellt, dass du Folgendes verwenden kannst:

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

Dies wird auch rekursiv alle Submodule ziehen, d. H. Abhängigkeiten.


33
2018-04-05 16:23



Wie es passieren kann, ist der Standardzweig Ihrer Submodule nicht  masterSo automatisiere ich die kompletten Git-Submodul-Upgrades:

git submodule init
git submodule update
git submodule foreach 'git fetch origin; git checkout $(git rev-parse --abbrev-ref HEAD); git reset --hard origin/$(git rev-parse --abbrev-ref HEAD); git submodule update --recursive; git clean -dfx'

30
2017-12-04 08:58



Erstes Mal

Clone- und Init-Submodul

git clone git@github.com:speedovation/kiwi-resources.git resources
git submodule init

Sich ausruhen

Während der Entwicklung ziehen und aktualisieren Sie das Submodul

git pull --recurse-submodules  && git submodule update --recursive

Aktualisieren Sie das Git-Submodul auf den letzten Commit für den Ursprung

git submodule foreach git pull origin master

Der bevorzugte Weg sollte unten sein

git submodule update --remote --merge

Hinweis: Die letzten beiden Befehle haben dasselbe Verhalten


24
2017-09-17 07:18



Ich weiß nicht, seit welcher Version von git das funktioniert, aber das ist was du suchst:

git submodule update --recursive

Ich benutze es mit git pull um auch das Root-Repository zu aktualisieren:

git pull && git submodule update --recursive

18
2017-09-30 14:10