Wie kann ich eine entfernte Datei in Mercurial wiederherstellen (wenn überhaupt)?

100

Durch die Verwendung einer grafischen Benutzeroberfläche im Gegensatz zur CLI habe ich versehentlich jede Datei in einem Mercurial-Projekt entfernt.

Ich erholte mich mit Revert ok und verlor etwas Arbeit, die ich, da ich eine Zeitmaschine habe, leicht zurückbekommen konnte. Aber gibt es eine Möglichkeit, solche Dateien zu entfernen / wiederherzustellen? Durchsuchte das Handbuch und googelte, konnte aber nichts sehen. Irgendwelche Plugins?

Ich beantworte hier wahrscheinlich meine eigene Frage, aber die Dateien wurden aus dem Verzeichnis entfernt und befanden sich nicht im Papierkorb, um sie wiederherzustellen. Ich gehe also davon aus, dass Entfernen unwiderruflich ist.

ps Ich weiß das hg forgetoder hg remove -Afwerde es entfernen, ohne es aus dem Verzeichnis zu löschen, aber meine Frage hat mit dem Fehler zu tun, den ich gemacht habe, im Gegensatz zu coolem Durchdenken der Aktion.

PurplePilot
quelle
1
Sie sollten in der Lage sein, eine ältere Revision zu
überprüfen
Das Problem war, dass ich festgeschrieben, Änderungen vorgenommen hatte, R (entfernt). Also nach dieser Sequenz ja, ich hatte das vorherige Commit bekommen, also ging ich darauf zurück und da ich ein Backup in Form einer Zeitmaschine habe, konnte ich die letzten Änderungen abrufen, sie dann hinzufügen und dann festschreiben. Wenn ich jedoch kein Backuop gehabt hätte, wären die Änderungen verloren gegangen.
PurplePilot
1
Verwandte Frage, mit der Sie nur Dateinamen suchen können (schnell): stackoverflow.com/questions/1013550/…
Michael Pryor

Antworten:

152

Verwenden Sie zunächst hg grep, um die gelöschte Datei zu finden, die Sie wiederherstellen möchten. Die Ausgabe dieses Befehls zeigt Ihnen die letzte Revision, für die die Datei vorhanden war, und den Pfad zur gelöschten Datei. Führen Sie hg revert -r <revision number> <path to deleted file> zweitens Folgendes aus: Die gelöschte Datei befindet sich jetzt in Ihrer Arbeitskopie und kann wieder in den Kopf übernommen werden.

BungleFeet
quelle
5
hat gut für mich funktioniert, danke. suchte nach der Antwort auf "Wie kann ich eine absichtlich gelöschte Datei wiederherstellen?"
nc.
Von Eclipse aus kann dies durch Rechtsklick auf die Datei Team auswählen
Emil
3
Eine andere Möglichkeit, die Revision zu finden, die die Datei enthält, isthg log -I '**file.ext'
mpen
2
Nur zu Ihrer Information: Sie möchten die Revisionsnummer des Commits, auf dem sich die Datei noch befindet, NICHT die, die sie entfernt hat!
Lukas Knuth
8

Zitat aus dem Kommentar:

Ich habe ein Repository eingerichtet, alle festgeschrieben, entfernt und dann erneut festgeschrieben

Wenn dies der Fall ist, müssen Sie nur das Arbeitsverzeichnis auf die vorherige Version aktualisieren:

$ hg update -C -r-2

Beachten Sie die negative Versionsnummer. Wenn die von Ihnen gelöschten Dateien nicht in der vorherigen Version enthalten sind, können Sie sie folgendermaßen finden:

$ hg log -v
mrucci
quelle
5

Nun, das hat bei mir funktioniert.

hg revert -r revision pathToTheFile
Shweta
quelle
4

Für Mercurial 1.6 und höher

Wenn Sie den Namen der Löschdatei kennen, können Sie deren Überarbeitung leicht finden mit:

hg log -r "removes('NAME.c')"

Dadurch erhalten Sie die Überarbeitung, wenn eine Datei mit dem Namen NAME.c (im Stammverzeichnis) gelöscht wird.

Dann können Sie die Datei auf die vorherige Revision zurücksetzen mit (wie bei anderen Antworten):

hg revert -r <revision number> <path to deleted file>

Sie können stattdessen ein Dateinamenmuster verwenden, um sich an das anzupassen, was Sie wissen. Beispielsweise können Sie **/NAME.cin allen Verzeichnissen suchen. Sie können darüber in Dateinamenmuster lesen . Verwenden Sie diesen Link, um Informationen zu den neuen Revset-Spezifikationen zu erhalten .

PhoneixS
quelle
1

Eine Ergänzung zur akzeptierten Antwort - dies ist schneller, wenn Sie alle Entfernungen in einem Commit rückgängig machen möchten. Ich habe einen großen Ordner mit ein paar hundert Dateien gelöscht und dies getan hg addremove, was überhaupt nicht meine Absicht war, also musste ich alle diese Löschvorgänge rückgängig machen.

Verwenden Sie "Gelöschte Dateien suchen" im Mercurial-Repository-Verlauf schnell? + xargs + tr, setze alle Entfernungen von Revision -3 auf die Version von Revision -4 zurück:

hg log -r -3 --template "{rev}: {file_dels}\n" | tr ' ' '\n' | xargs hg revert -r -4 

Beachten Sie, dass dies fehlschlägt, wenn eine Ihrer Dateien Leerzeichen im Namen enthält. http://hgbook.red-bean.com/read/customizing-the-output-of-mercurial.html scheint derzeit keine Vorlagen zu haben, nach denen {file_dels}geteilt \nwird.

Keflavich
quelle
0

Sie können das letzte Commit für ein Repo mit rückgängig machen hg rollback. Es ist nur eine Rollback-Ebene verfügbar. Wenn Sie also das Entfernen mit mehr als einem Commit durchgeführt haben, wird Ihre Änderung dadurch nicht vollständig rückgängig gemacht. Dies funktioniert nur in Ihrem lokalen Repository. Wenn Sie also gepusht haben, können Sie es im Remote-Repo nicht rückgängig machen.

ataylor
quelle
1
Nein, das funktioniert nicht. Ich verwende einen Mac mit Mercurial Distributed SCM (Version 1.4.1 + 20091201). Ich habe ein Repository eingerichtet, alle festgeschrieben, entfernt und dann erneut festgeschrieben, aber dies bringt nur eine Liste der Dateien zurück, die als R (entfernt) markiert sind, bringt die Dateien jedoch nicht zurück. Wenn ich die Dateien vor dem Festschreiben als R (entfernt) und Rollback markiere, passiert auch nichts.
PurplePilot
Nachdem Sie das hg-Rollback durchgeführt haben, wird Ihr Repo zurückgesetzt, aber Ihr aktuelles Arbeitsverzeichnis enthält weiterhin Ihre Änderungen. Sagen Sie hg einfach, dass es ein sauberes Update für die zurückgesetzte Revision durchführen soll, jetzt auf dem Tipp: hg up -C.
Ataylor
1
hg rollbackDie entfernte Datei wird nicht wiederhergestellt, da das Löschen der Datei nicht Teil der Festschreibungstransaktion ist.
Mrucci
4
Das stimmt. Wenn Sie nach Änderungen suchen, die vor dem Entfernen nicht festgeschrieben wurden, gehen sie verloren.
Ataylor
0

Sie können festgeschriebene Revisionen mit dem hg stripBefehl entfernen , der von der Erweiterung mq (Mercurial Queues) bereitgestellt wird. Dies sollte Ihnen Ihre Dateien zurückgeben.

Erstellen Sie vor dem Ausprobieren ein Backup, da dadurch die Mercurial-Datenbank mit Änderungssätzen geändert wird.

Daniel Kullmann
quelle
0

Die folgende Methode ist unkompliziert und so dumm, dass nichts schief gehen kann. Wenn Sie mehrere Dateien gelöscht oder umbenannt haben, ist dies in Ordnung.

hg clone mydirectory mydirectory1

und jetzt starten Sie mc (oder Far Manager) und vergleichen, was es war und was es geworden ist.

Wenn es fertig ist, einfach löschen mydirectory1.

18446744073709551615
quelle
0

Folgendes hat bei mir funktioniert.

hg revert -r <Revision Number> <File Name>

(Optional, um alle Dateien zurückzusetzen)

hg revert -r <Revision Number> --all
Naveen Kumar V.
quelle