Ich habe ein Git-Submodul (RestKit), das ich meinem Repo hinzugefügt habe.
Ich habe dort versehentlich einige Dateien geändert und möchte zur Quellversion zurückkehren. Um das zu tun, habe ich versucht zu rennen
Mac:app-ios user$ git submodule update RestKit
Aber wie Sie hier sehen können, hat dies nicht funktioniert, da es sich immer noch um "modifizierten Inhalt" handelt:
Mac:app-ios user$ git status
...
# modified: RestKit (modified content)
Sogar
Mac:app-ios user$ git submodule update -f RestKit
setzt lokal geänderte Dateien nicht zurück.
Wie setze ich den Inhalt dieses Submoduls zurück?
git
git-submodules
Eric
quelle
quelle
git reset --hard
dies nicht funktioniert, geben Sie zuerst den Remote-Zweig mit angit reset --hard origin/<branch_name>
.Antworten:
Wechseln Sie in das Verzeichnis des Submoduls und führen Sie dann a aus
git reset --hard
, um alle geänderten Dateien auf ihren letzten festgeschriebenen Status zurückzusetzen. Beachten Sie, dass dadurch alle nicht festgeschriebenen Änderungen verworfen werden.quelle
git submodule update --init
arbeitete für mich; ohne--init
es hat überhaupt nicht funktioniert.git submodule update -f --init
für meinen Fall.Wenn Sie dies für alle Submodule tun möchten, ohne die Verzeichnisse ändern zu müssen, können Sie dies ausführen
git submodule foreach git reset --hard
Sie können das rekursive Flag auch verwenden, um es auf alle Submodule anzuwenden:
git submodule foreach --recursive git reset --hard
quelle
git submodule foreach --recursive git clean -x -f -d
Eine ausfallsichere Methode als alle vorherigen Antworten:
Der erste Befehl "löst" alle Submodule vollständig, der zweite führt dann eine neue Überprüfung durch.
Es dauert länger als die anderen Methoden, funktioniert jedoch unabhängig vom Status Ihrer Submodule.
quelle
error: Your local changes to the following files would be overwritten by checkout
*
in meinemPS1
, dergit status -uno
es nicht erklären konnte).Gut für mich zu haben
Setzen Sie das Submodul einfach auf den Status zurück, in dem es ausgecheckt wurde. Dies ist für das Repo-referenzierte Commit / den Status des Main nicht erforderlich. Ich werde immer noch "geänderte Inhalte" haben, wie OP sagte. Um das Submodul wieder auf das korrekte Commit zu bringen, führe ich Folgendes aus:
Wenn ich das tue
git status
, ist es auf dem Submodul sauber.quelle
submodule update --init
scheint es in meinem Fall ohnehin nicht möglich zu sein, lokale Änderungen rückgängig zu machen: |Führen Sie 4 Schritte nacheinander aus:
quelle
git submodule update
war das, was das(new commits)
für mich behoben hat.Dies hat bei mir funktioniert, auch rekursiv in Submodule (vielleicht hat Ihr -f deshalb nicht funktioniert, weil Sie ein Submodul innerhalb des Submoduls geändert haben):
quelle
Versuchen Sie dies zuerst, wie andere gesagt haben:
Wenn dies nicht funktioniert, wechseln Sie in das Submodulverzeichnis und verwenden Sie den folgenden Befehl, um festzustellen, ob Änderungen am Submodul vorgenommen wurden:
Wenn sich Änderungen an Ihrem Submodul ergeben, entfernen Sie diese. Stellen Sie sicher, dass Sie keine Änderungen sehen können, wenn Sie "git status" ausführen.
Kehren Sie als Nächstes zum Haupt-Repository zurück und führen Sie "git submodule update --init" erneut aus.
quelle
Seit Git 2.14 (Q3 2017) müssen Sie nicht mehr in jedes Submodul gehen, um ein
git reset
(wie ingit submodule foreach git reset --hard
) zu erstellen.Das liegt daran, dass Git Reset selbst jetzt weiß, wie man rekursiv in Submodule geht.
Siehe Commit 35b96d1 (21. April 2017) und Commit f2d4899 , Commit 823bab0 , Commit cd279e2 (18. April 2017) von Stefan Beller (
stefanbeller
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit 5f074ca , 29. Mai 2017)git-reset
ist ein weiterer funktionierender Baummanipulator, der über Submodule unterrichtet werden sollte.Warnung : der Unterschied zwischen:
git reset --hard --recurse-submodule
undgit submodule foreach git reset --hard
Ersteres setzt auch den Haupt-Repo-Arbeitsbaum Ihres Elternteils zurück, da Letzteres nur den Arbeitsbaum der Submodule zurücksetzt.
Also mit Vorsicht verwenden.
quelle
Für git <= 2.13 sollten diese beiden Befehle zusammen Ihre Repos mit rekursiven Submodulen zurücksetzen:
quelle
Dies funktioniert mit unseren Bibliotheken unter GIT v1.7.1, in denen wir ein DEV-Paket-Repo und ein LIVE-Paket-Repo haben. Die Repositorys selbst sind nichts anderes als eine Shell zum Packen der Assets für ein Projekt. alle Submodule.
Das LIVE wird niemals absichtlich aktualisiert, es können jedoch Cache-Dateien oder Unfälle auftreten, die das Repo verschmutzen. Neue Submodule, die dem DEV hinzugefügt wurden, müssen ebenfalls in LIVE initialisiert werden.
Paket-Repository in DEV
Hier möchten wir alle Upstream-Änderungen abrufen, die uns noch nicht bekannt sind, und dann unser Paket-Repository aktualisieren.
Paket-Repository in LIVE
Hier möchten wir die Änderungen abrufen, die in das DEV-Repository übernommen wurden, aber keine unbekannten Upstream-Änderungen.
quelle
Wenn Sie alle Änderungen im gesamten Repository zusammen mit den Untermodulen verwerfen möchten, können Sie verwenden
git restore . --recurse-submodules
Dadurch werden alle im Repository und in den Submodulen vorgenommenen Änderungen rückgängig gemacht.
quelle
meine Art, alle Submodule zurückzusetzen (OHNE ihren "Master" -Zweig zu trennen und zu behalten):
git submodule foreach 'git checkout master && git reset --hard $ sha1'
quelle