Was ist der richtige Weg, um eine gelöschte Datei aus SVN wiederherzustellen?

119

Ich habe eine Datei aus einem Repo gelöscht und möchte sie jetzt zurücklegen. Das Beste, was ich herausfinden kann, ist:

  • Aktualisieren Sie die Version vor dem Löschen
  • Kopieren Sie die Dateien an eine andere Stelle
  • Update auf Kopf
  • Kopieren Sie die Dateien zurück
  • füge sie hinzu
  • verpflichten

Das riecht nur schlecht und es verliert die gesamte Geschichte, um zu booten. Es muss einen besseren Weg geben, dies zu tun. Ich habe bereits im SVN-Buch nachgesehen , aber nichts gefunden und schaue jetzt in der SVN-Tag-Liste nach.

BCS
quelle
4
Sicherlich ist Tukushans Antwort die richtige direkte Antwort auf Ihre Frage und sollte akzeptiert werden?
James McCormack
@ JamesMcCormack: siehe den NB in ​​seiner Antwort.
BCS
2
Ein Tipp: Wenn Sie die Datei gelöscht und die Änderung noch nicht festgeschrieben haben, klicken Sie einfach mit der rechten Maustaste und aktualisieren Sie sie, um sie wiederherzustellen.
Hammad Khan

Antworten:

57

Verwenden Sie svn merge:

svn merge -c -[rev num that deleted the file] http://<path to repository>

Also ein Beispiel:

svn merge -c -12345 https://svn.mysite.com/svn/repo/project/trunk
             ^ The negative is important

Für TortoiseSVN (ich denke ...)

  • Klicken Sie mit der rechten Maustaste in den Explorer und gehen Sie zu TortoiseSVN -> Zusammenführen ...
  • Stellen Sie sicher, dass "Eine Reihe von Revisionen zusammenführen" ausgewählt ist, und klicken Sie auf "Weiter"
  • Geben Sie im Textfeld "Zusammenzuführender Revisionsbereich" die Revision an, mit der die Datei entfernt wurde
  • Aktivieren Sie das Kontrollkästchen "Zusammenführen rückgängig machen" und klicken Sie auf "Weiter"
  • Klicken Sie auf Zusammenführen

Das ist jedoch völlig ungetestet.


Bearbeitet von OP : Dies funktioniert auf meiner Version von TortoiseSVN (die alte Art ohne den nächsten Button)

  • Gehen Sie zu dem Ordner, aus dem das Material gelöscht wurde
  • Klicken Sie mit der rechten Maustaste in den Explorer und gehen Sie zu TortoiseSVN -> Zusammenführen ...
  • Geben Sie im Abschnitt Von die Revision ein, die das Löschen durchgeführt hat
  • in dem Um Abschnitt die Revision vor dem Löschen ein.
  • Klicken Sie auf "Zusammenführen"
  • verpflichten

Der Trick besteht darin, rückwärts zu verschmelzen . Ein großes Lob an sean.bright für den Hinweis in die richtige Richtung!


Bearbeiten: Wir verwenden verschiedene Versionen. Die von mir beschriebene Methode funktionierte perfekt mit meiner Version von TortoiseSVN.

Beachten Sie auch, dass Sie bei mehreren Änderungen am Commit, die Sie rückgängig machen, diese anderen Änderungen rückgängig machen möchten, sobald die Zusammenführung vor dem Commit abgeschlossen ist. Wenn Sie dies nicht tun, werden diese zusätzlichen Änderungen ebenfalls rückgängig gemacht.

Sean Bright
quelle
Ich bin unter Windows und habe keine CLI-Version von SVN. Wussten Sie, wie man ortoiseSVN das macht?
BCS
Schildkröte hat "Zusammenführen" im Kontextmenü. Es hat Felder für die rev auszufüllen. Auch "Trockenlauf", um zu sehen, ob Sie es richtig eingestellt haben. Und denken Sie daran, das Ergebnis zählt erst, wenn Sie es festschreiben. Sie können zurückkehren, wenn alles durcheinander gerät.
Gbarry
Ich würde sagen, das OP hat eine ältere Version von Tortoise. Der neuere hat einen anderen (minderwertigen) Zusammenführungsdialog
1800 INFORMATION
Ich habe noch kein Zusammenführungssystem gesehen, das nicht gesaugt hat. Text, Dateien, Verzeichnisse, Word-Dokumente, igitt. Ich denke, es ist kein lösbares Problem. OTOH Dinge können mehr oder weniger saugen. :)
BCS
1
Wenn Sie mehrere Dateien zurücksetzen und dann eine der Zurücksetzungen zurücksetzen, ist dies nicht rückgängig zu machen. Autsch! Ich glaube, ich habe gerade etwas verletzt.
BCS
176

Das Problem bei der Durchführung einer SVN-Zusammenführung, wie von Sean Bright vorgeschlagen, besteht darin, dass andere Änderungen, die in derselben Revision wie beim Löschen vorgenommen wurden, wieder eingeführt werden. Eine SVN-Kopie ist eine gezieltere Operation, die nur die gelöschten Dateien betrifft.

Mit Tortoise SVN können Sie eine Datei, die aus Ihrem Arbeitskopienverzeichnis und aus späteren SVN-Revisionen gelöscht wurde, über eine SVN-Kopie wie folgt wiederbeleben:

  • Navigieren Sie zu dem Arbeitskopienordner, der zuvor die Datei enthielt.
  • Klicken Sie mit der rechten Maustaste auf den Ordner im Explorer und gehen Sie zu TortoiseSVN -> Protokoll anzeigen.
  • Klicken Sie mit der rechten Maustaste auf die Versionsnummer unmittelbar vor der Überarbeitung, mit der die Datei gelöscht wurde, und wählen Sie "Repository durchsuchen".
  • Klicken Sie mit der rechten Maustaste auf die gelöschte Datei und wählen Sie "In Arbeitskopie kopieren ..." und speichern Sie.

Die gelöschte Datei befindet sich jetzt im Arbeitskopienordner. Um es wieder zu SVN hinzuzufügen, klicken Sie mit der rechten Maustaste auf die wiederhergestellte Datei und wählen Sie SVN Commit.

Hinweis: Bei dieser Methode wird der vorherige Verlauf der wiederhergestellten Datei beibehalten. Um jedoch den vorherigen Verlauf im TortoiseSVN-Protokoll anzuzeigen, müssen Sie sicherstellen, dass im Dialogfeld "Protokollnachrichten" die Option "Beim Kopieren / Umbenennen anhalten" deaktiviert ist.

Tekumara
quelle
26
Dies kann auch direkt auf dem Server durchgeführt werden, nützlich, wenn die gelöschten Dateien oder Ordner ziemlich groß waren: svn cp -r 1993 http://example.com/svn/trunk/path@1993 http://example.com/svn/trunk/path
Craig
Dies ist der richtige Weg. Ich habe es gerade mit TortoiseSVN 1.8.1 versucht und es funktioniert wie empfohlen.
Dr. Gianluigi Zane Zanettini
Perfekt!! Einfach und effektiv. Vielen Dank für die Lösung
Hunter
Diese Methode hat es mir viel einfacher gemacht, eine Datei in einem untergeordneten Zweig wiederherzustellen, der aus dem übergeordneten Zweig gelöscht wurde. Vielleicht gab es einen Weg, das zu tun merge, aber ich habe es nicht herausgefunden.
arr_sea
"Kurz vor" in Schritt 3 ist wichtig. In Schritt 4 beschwerte sich Tortoise immer wieder darüber, dass die Datei bereits vorhanden ist, obwohl ich sie mit einem Windows-Löschvorgang gelöscht hatte. Ich musste zuerst meine Arbeitskopie aktualisieren. (Mein Kollege hat mehrere Dateien mit Tortoise delete gelöscht und dann die Änderungen festgeschrieben.) TortoiseSVN 1.8.1.
Leqid
16

Verwenden Sie die Tortoise SVN-Kopierfunktion, um festgeschriebene Änderungen rückgängig zu machen:

  1. Klicken Sie mit der rechten Maustaste auf den übergeordneten Ordner, der die gelöschten Dateien / Ordner enthält
  2. Wählen Sie das "Show Log"
  3. Wählen Sie die Version aus und klicken Sie mit der rechten Maustaste darauf, vor der die Änderungen / Löschungen vorgenommen wurden
  4. Wählen Sie das "Repository durchsuchen"
  5. Wählen Sie die Datei / den Ordner aus, die / der wiederhergestellt werden soll, und klicken Sie mit der rechten Maustaste
  6. Wählen Sie "Kopieren nach", um die Dateien / Ordner in die Kopfversion zu kopieren

hoffentlich hilft das

Mukul Joshi
quelle
13

Ich scheine immer svn copy als Serveroperation zu verwenden, bin mir also nicht sicher, ob es mit zwei Arbeitspfaden funktioniert.

Hier ist ein Beispiel für das Wiederherstellen einer gelöschten Datei in einer lokalen Arbeitskopie des Projekts:

svn copy https://repos/project/modules/module.js@3502 modules/module.js

Während Sie sich im Projektverzeichnis befinden. Dies funktioniert auch zum Wiederherstellen ganzer Verzeichnisse.

NullPoiиteя
quelle
2
+1 Die Kopie @ hat funktioniert. Die Kopie -r scheint nicht für die Verwendung von CollabNet svn 1.6.17 unter Mac OS X zu funktionieren.
Grau
2
Die verwendete Revision sollte auch die Revision unmittelbar vor dem Löschen sein.
Grau
6

Wenn Sie Tortoise SVN verwenden, sollten Sie in der Lage sein, Änderungen von nur dieser Revision in Ihre Arbeitskopie zurückzusetzen (effektiv eine umgekehrte Zusammenführung durchzuführen), und dann ein weiteres Commit ausführen, um die Datei erneut hinzuzufügen. Folgende Schritte sind zu befolgen:

  1. Navigieren Sie zu dem Ordner in der Arbeitskopie, in dem Sie die Datei gelöscht haben.
  2. Gehen Sie zum Repo-Browser.
  3. Navigieren Sie zu der Version, in der Sie die Datei gelöscht haben.
  4. Suchen Sie in der Änderungsliste die gelöschte Datei.
  5. Klicken Sie mit der rechten Maustaste auf die Datei und gehen Sie zu "Änderungen aus dieser Revision zurücksetzen".
  6. Dadurch wird die Datei in Ihrer Arbeitskopie wiederhergestellt, wobei der Verlauf beibehalten wird.
  7. Übernehmen Sie die Datei, um sie wieder in Ihr Repository aufzunehmen.
Davogone
quelle
OK, in diesem Fall war die Frage, wie man das macht, was man gerade beschrieben hat. (Antwort: Merge rückwärts verwenden)
BCS
1
Ich habe darüber gesprochen, wie es in Tortoise SVN geht. Ich werde mehr Details hinzufügen.
Davogones
5

Der einfachste Weg, Dateien wiederherzustellen und den Revisionsverlauf nicht zu verlieren, ist die Verwendung der SVN-Kopie . Das obige Zusammenführungsbeispiel scheint mir ein komplexerer Weg zu sein, um dasselbe zu erreichen. Warum muss zusammengeführt werden, wenn Sie einfach eine Revision wiederherstellen möchten?

Ich benutze das Folgende in diesem Fall und es funktioniert ganz gut.

svn copy -m 'restoring file' -r <rev_number_file_to_restore> http://from/file.cs http://pathTo/file.cs

Ich scheine immer als Serveroperation zu verwenden, bin mir svn copyalso nicht sicher, ob es mit zwei Arbeitspfaden funktioniert.

Daniel Honig
quelle
3
SVN COPY ist der empfohlene Ansatz. Die Syntax ist sehr einfach: svn copy [SVN URL] @ [REVISION # WHERE FILE EXISTS] [LOCAL PATH TO RESTORE TO] von visualsvn.com/support/svnbook/branchmerge/basicmerging . Ich habe das gerade selbst benutzt.
Amit
Das macht für mich am meisten Sinn, ich benutze auch diesen Ansatz
Dmitry Pashkevich
4

Mit Schildkröte SVN :

Wenn Sie Ihre Änderungen noch nicht festgeschrieben haben, können Sie den übergeordneten Ordner wiederherstellen, in dem Sie die Datei oder das Verzeichnis gelöscht haben.

Wenn Sie die gelöschte Datei bereits festgeschrieben haben, können Sie den Repository-Browser verwenden, zu der Revision wechseln, in der die Datei noch vorhanden war, und dann den Befehl Kopieren nach ... aus dem Kontextmenü verwenden. Geben Sie den Pfad zu Ihrer Arbeitskopie als Ziel ein, und die gelöschte Datei wird aus dem Repository in Ihre Arbeitskopie kopiert.

VonC
quelle
nett. Ich werde das nächste Mal versuchen.
BCS
1

Sie sollten in der Lage sein, nur die eine Datei auszuchecken, die Sie wiederherstellen möchten. Versuchen Sie etwas wie svn co svn://your_repos/path/to/file/you/want/to/restore@revwo revist die letzte Revision, bei der die Datei existierte.

Ich musste vor einiger Zeit genau das tun und wenn ich mich richtig erinnere, hat die -rOption, svnnicht zu funktionieren, funktioniert. Ich musste die :revSyntax verwenden. (Obwohl ich mich vielleicht rückwärts daran erinnert habe ...)

David Z.
quelle
Das will ich nicht. Ich möchte die Datei wieder in das Repo patchen und SVN wissen lassen, dass es sich um dieselbe Datei handelt.
BCS