webentwicklung-frage-antwort-db.com.de

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

Versehentlich entfernte ich mithilfe einer GUI im Gegensatz zu CLI alle Dateien in einem Mercurial-Projekt.

Ich erholte mich mit Revert in Ordnung und verlor einige Arbeit, die ich als Zeitmaschine leicht zurückbekommen konnte. Aber gibt es eine Möglichkeit, solche Dateien zu entfernen/wiederherzustellen? Durch das Handbuch gefahren und gegoogelt, aber nichts gesehen. Irgendwelche Plugins?

Ich beantworte wahrscheinlich meine eigene Frage hier, aber die Dateien waren aus dem Verzeichnis verschwunden und konnten nicht im Papierkorb wiederhergestellt werden.

p.s. Ich weiß, dass hg forget oder hg remove -Af entfernt wird, ohne aus dem Verzeichnis gelöscht zu werden, aber meine Frage hat mit dem Fehler zu tun, den ich gemacht habe.

95
PurplePilot

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 als Nächstes hg revert -r <revision number> <path to deleted file>.__ aus. Die gelöschte Datei befindet sich nun in Ihrer Arbeitskopie und ist bereit zu sein zurück in den Kopf begangen.

146
BungleFeet

Zitat aus Kommentar:

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

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

$ hg update -C -r-2

Notiere die negative Revisionsnummer. Wenn sich die gelöschten Dateien nicht in der vorherigen Version befinden, können Sie sie mit folgendem Befehl finden:

$ hg log -v
8
mrucci

Nun, das hat für mich funktioniert.

hg revert -r revision pathToTheFile
5
Shweta

Für Mercurial 1.6 und höher

Wenn Sie den Namen der Löschdatei kennen, können Sie die Revision leicht finden mit:

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

Dadurch erhalten Sie die Revision, in der eine Datei namens NAME.c (im Stammverzeichnis) gelöscht wird.

Dann können Sie die Datei mit der vorherigen Version wiederherstellen (wie andere Antworten):

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

Sie können stattdessen ein Dateinamensmuster verwenden, um sich an das, was Sie wissen, anzupassen. Beispielsweise können Sie mit **/NAME.c in allen Verzeichnissen suchen. Sie können darüber in File Name Patters lesen. Und nutzen Sie diesen Link, um sich über die neuen revset-Spezifikationen zu informieren .

4
PhoneixS

Eine Ergänzung zur akzeptierten Antwort - dies ist schneller, wenn Sie alle Entfernungen in einem Commit rückgängig machen möchten. Ich löschte einen großen Ordner mit ein paar Hundert Dateien und machte hg addremove, was gar nicht meine Absicht war, also musste ich all diese Löschungen rückgängig machen.

Mit gelöschte Dateien schnell im Mercurial-Repository-Verlauf suchen? + xargs + tr, setzt alle Revisionen der Version -3 von der Version -4 auf die Version 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 der Dateien Leerzeichen im Namen enthält. http://hgbook.red-bean.com/read/customizing-the-output-of-Mercurial.html scheint keine Vorlagen zu haben, bei denen {file_dels} momentan von \n geteilt wird.

1
keflavich

Die unten beschriebene Methode ist unkompliziert und so dumm, dass sie nichts falsch machen 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, löschen Sie einfach mydirectory1.

Sie können das letzte Commit für ein Repo mit hg rollback rückgängig machen. Es gibt nur eine Ebene für das Rollback. Wenn Sie 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 einen Push ausgeführt haben, können Sie ihn nicht im Remote-Repo rückgängig machen.

0
ataylor

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

Machen Sie eine Sicherungskopie, bevor Sie es ausprobieren, da dadurch die Mercurial-Änderungsdatenbank geändert wird.

0
daniel kullmann

Folgendes hat für mich gearbeitet.

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

(Optional, um alle Dateien wiederherzustellen)

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