2013-02-27 4 views
14

Ich habe ein Git Repo mit mehreren Submodulen. Eines dieser Submodule hat mehrere eigene Submodule. Alles, was ich tun möchte, ist eine alte Commit auf dem Master-Repo zu überprüfen und es die entsprechenden Commits von allen Submodulen auschecken, um den richtigen Status des Codes zu diesem Zeitpunkt zu erhalten.Wie alte git commit einschließlich aller Untermodule rekursiv auschecken?

Ich weiß, dass git enthält die notwendigen Informationen wie der ls-tree Befehl kann mir sagen, welche Commit jedes Submodul war. Allerdings muss ich jeden manuell auschecken, was schmerzhaft zeitaufwendig ist.

Ich bin auf der Suche nach etwas wie git checkout --recursive, aber ein solcher Befehl scheint nicht zu existieren.

Gibt es trotzdem etwas zu tun?

+0

Hinweis: 'git checkout --recurse-submodules' existiert heute tatsächlich (2017). Aber nur das kommende Git 2.14 wird es richtig funktionieren lassen. Siehe [meine Antwort unten] (https://stackoverflow.com/a/44249558/6309). – VonC

Antwort

17

Sie benötigen zwei Befehle, dies zu erreichen:

git checkout *oldcommit* 
git submodule update --recursive 
+1

Vielen Dank! Natürlich war es etwas Einfaches. –

4

Abhängig davon, ob oder nicht, es gibt mehr Submodule in der alten Kasse, können Sie die folgenden initialisieren Submodule zu tun haben, die nicht da sind nicht mehr in Commits:

git checkout *oldcommit* 
git submodule init 
git submodule update --recursive 
6

Hinweis: wenn Sie mehrere Submodule (und Submodule innen Submodule) haben, Git 2,14 (Q3 2017) wird dazu beitragen, (aktuellere, dass die OP ab 2013)

Mit --recurse-submodules wird der Inhalt aller initialisierten Submodule entsprechend dem Commit aktualisiert, das im Superprojekt aufgezeichnet wurde.
Wenn lokale Änderungen in einem Submodul überschrieben werden, schlägt die Überprüfung fehl, sofern -f nicht verwendet wird.

git checkout --recurse-submodules“ nicht ganz der Arbeit mit einem Submodul, dass sich Submodule hat. Es wird mit Git 2.14.

+0

Ich verstehe nicht, warum '-f' immer notwendig ist. Ohne '-f' werden die Submodule nicht aktualisiert. – linquize

+0

@linquize '-f' sollte nur notwendig sein, wenn Sie eine lokale Änderung im Submodul haben. – VonC