Was ist eine einfache Möglichkeit, eine Datei in Subversion wiederherzustellen?


74

Diese Anweisungen sind ein wenig einschüchternd und verwirrend: http://svnbook.red-bean.com/de/1.0/ch04s04.html#svn-ch-4-sect-4.3 . Und sie scheinen auch nicht zu erwähnen, dass es viel einfacher ist, wenn Sie nach dem " svn rm" [1] noch nicht eingecheckt haben .

Also dachte ich, dies wäre ein guter Ort, um eine einfachere Antwort für diejenigen aufzuzeichnen, die danach googeln.

[1] Für einen SVN-Neuling scheint es, dass " svn rm" die Datei sofort zerstört. Ich erinnere mich, svn rmdass ich dachte, das würde es einfach aus der Quellcodeverwaltung entfernen und ausflippen, wenn die Datei selbst tatsächlich verschwand. Eine Unterfrage lautet also: Was ist der richtige Weg, um eine Datei aus der Versionskontrolle zu entfernen, ohne Ihre lokale Kopie tatsächlich zu entfernen?


svn status | grep "^D" | awk '{print $2}' | xargs svn revert
Fiorentinoing

Antworten:


89

Wenn du es gerade getan hast

svn rm foo.txt

dann können Sie das einfach rückgängig machen

svn revert foo.txt

Wenn Sie nach dem " svn rm" bereits eingecheckt haben , können Sie das Protokoll ( svn log) anzeigen, die letzte Revision finden, in der die Datei vorhanden war, und sie aus dieser Version abrufen.

Eine Möglichkeit, dies zu tun, besteht darin, die alte Version mit der Datei zusammenzuführen. Angenommen, die aktuelle Version ist 123 und die letzte Version mit dieser Datei ist 120, dann gehen Sie folgendermaßen vor:

svn merge -r123:120

Vielleicht machen Sie zuerst einen Probelauf, um sicherzustellen, dass nichts funktioniert, was Sie nicht wollen:

svn --dry-run merge -r123:120

Für die Unterfrage, wie man eine Datei aus svn entfernt, ohne die lokale Kopie zu entfernen:

svn rm foo.txt --keep-local

Oder Sie können natürlich einfach vor dem Svn rm'ing in eine temporäre Datei kopieren und dann zurückkopieren:

cp foo.txt foo.txt-tmp
svn rm foo.txt
(svn ci -m "just removed foo.txt from the repository")
cp foo.txt-tmp foo.txt

1
Das Problem beim Zusammenführen besteht darin, dass der vorherige Verlauf der Datei verloren geht. svn cp, wie in Stefans Antwort beschrieben, ist wahrscheinlich besser und leichter zu verstehen.
Avi

Tolle Antwort, hat mir den Tag gerettet. Vielen Dank! pls1
eleganter Benutzer

Ich fand, wenn die Versionsreihenfolge geändert wird, wird nur die entfernte Datei zur aktuellen Arbeitskopie hinzugefügt, ohne dass andere die nicht entfernte Datei ändern, z. B.svn merge -r120:123 svn_url .
zhuguowei

svn revertfunktionierte nicht rekursiv und ich musste tunsvn stat | egrep ^D | cut -c8- | xargs svn revert
Axel Bregnsbo

Mein Problem mit der "umgekehrten Zusammenführung" ist, dass es einen Baumkonflikt erzeugt.
UncaAlby

43

aus irgendeinem -rgrund funktionierte das arg bei mir nicht (svn version 1.6.9). Ich habe es vor und nach dem versucht src, aber immer wieder die Meldung erhalten, dass die Datei in der aktuellen Version (duh) nicht gefunden wurde. Gleiches gilt für --revision. Die Verwendung der @ style-Syntax hat jedoch funktioniert:

svn cp url/to/removed/foo.txt@4 foo.txt

Ich weiß nie, wie man die letzte Arbeitsversion am einfachsten ermittelt, aber diese Aussage ist Gold wert.
Bernhard Döbler

Was ist die @ style Syntax?
Ferdinando Randisi

In der Regel geben Sie -reine Revisionsnummer an (siehe Revisionsspezifizierer ). Die @Notation ist für Peg Revision (siehe Peg und Operative Revisionen )
Michael Rush

1
Wenn Sie sich keine Sorgen machen möchten, die tatsächliche URL zu Ihrem Repo zu finden, können Sie ^/path/from/repo/rootstattdessen verwenden. In meinem Fall habe ich beispielsweise ^/trunk/path/to/my/file.jseine Datei wiederhergestellt, die sich ursprünglich path/to/my/file.jsin meiner Arbeitskopie befand (dh ^/trunk).
Eric Seastrand

Diese Antwort bietet viel Klarheit für ein Konzept, über das ich sehr verwirrt war. Auch ich konnte eine Datei mit -r <vorherige Revision> mit einer Fehlermeldung, die besagt, dass sie nicht in der aktuellen Revision enthalten ist, nicht "wiederherstellen". Nachdem ich den obigen Link über Peg-Revisionen gelesen habe, verstehe ich, dass Subversion möchte, dass ich eine Peg-Revision mit dem at-Zeichen spezifiziere, in dem diese Datei vorhanden ist, damit sie weiß, nach welcher (potenziellen) Kopie von oldfile.c ich frage.
SirNickity

31

Verwenden Sie, um eine Datei zu entfernen, aber in der Arbeitskopie zu belassen

svn rm foo.txt --keep-local

Um eine Datei zurückzugewinnen, nachdem Sie das Entfernen festgeschrieben haben, können Sie entweder den Befehl zum Zusammenführen oder den Befehl zum Kopieren verwenden. Beide behalten den Dateiversionsverlauf bei. Da der Zusammenführungsweg bereits an anderer Stelle beschrieben ist, ist hier der Kopierweg:

svn rm foo.txt
svn ci foo.txt -m "removed file"
(now at r5 as an example)
svn cp url/to/removed/foo.txt -r4 foo.txt
svn ci foo.txt -m "got file back"

7
Damit ich arbeiten kann, muss der Kopierbefehl etwas anders sein: svn cp url/to/removed/foo.txt@4 -r4 foo.txt ---- ohne das @ 4 erhalte ich den Fehler "Pfad nicht gefunden"
Barth

Ja, für mich habe ich "url / to / remove" gefunden, indem ich svn infoim Verzeichnis ausgeführt und das Feld "URL" angesehen habe. Dann musste ich auch den "@ 4" -Trick machen, und das "-r4" war nicht notwendig. Interessanterweise wird der Dateiprotokollverlauf mit Ausnahme des Löscheintrags wiederhergestellt!
Heath Raftery

6

Für TortoiseSVN-Benutzer ist dies sehr einfach über den Repo-Browser möglich. Wechseln Sie im Repo-Browser zur Revision, bevor die Datei gelöscht wurde (Sie können die Version über die Schaltfläche "Revision:" oben rechts ändern):

Geben Sie hier die Bildbeschreibung ein

Sie sollten dann in der Lage sein, die gelöschte Datei an ihrem ursprünglichen Speicherort im Repo-Browser anzuzeigen. Klicken Sie mit der rechten Maustaste darauf und wählen Sie "In Arbeitskopie kopieren ...":

Geben Sie hier die Bildbeschreibung ein

Die Datei wird dann in Ihrer Arbeitskopie wiederhergestellt, bereit zum Festschreiben (als ob svn hinzugefügt worden wäre) und mit intaktem Protokollverlauf.


4

So setzen Sie eine gelöschte Datei in SVN zurück Suchen Sie die Revisionsnummer kurz vor dem Löschen (z. B. 341). Setzen Sie dann diese Datei alleine auf diese Versionsnummer zurück.

svn up -r341 [path_to_deletedFile]

2
Dadurch wird eine weitere lokale Kopie abgerufen, die Datei bleibt jedoch im Repository "gelöscht". Ihr nächstes "svn up" wird es verschwinden sehen.
UncaAlby

1

Ich habe den Kopiermenüpunkt aus der vorherigen Revision mit Schildkröte verwendet, für mich gearbeitet und den Verlauf beibehalten.


2
Klingt vielversprechend, können Sie weitere Details angeben? Woher genau geben Sie den Kopierbefehl aus?
VdesmedT
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.