2009-01-30 9 views
60

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

Also ich dachte, dies wäre ein guter Ort, um eine einfachere Antwort für diejenigen zu notieren, die dafür suchen.

[1] Für einen SVN-Neuling scheint es, dass "svn rm" sofort die Datei zerstört. Ich erinnere mich daran, svn rm zu denken, dass es nur aus der Quellcodeverwaltung entfernen und ausflippen würde, wenn die Datei selbst tatsächlich verschwunden ist. Eine Unterfrage ist also, wie man eine Datei aus der Versionskontrolle entfernt, ohne die lokale Kopie tatsächlich zu entfernen.

+0

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

Antwort

73

Wenn Sie nur

tat
svn rm foo.txt 

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

svn revert foo.txt 

Wenn Sie bereits nach dem Handeln der „svn rm“ eingecheckt, dann können Sie sich das Protokoll aussehen (svn log) , finde die letzte Revision, wo die Datei existiert, und schnappe sie von dieser Version.

Eine Möglichkeit besteht darin, die alte Revision mit der Datei zusammenzuführen. die aktuelle Version unter der Annahme, 123 und die letzte Version mit dieser Datei ist 120, dann tun:

svn merge -r123:120 

Vielleicht zuerst einen Testlauf nicht sicherstellen, dass es etwas nicht tun, werden Sie nicht wollen:

svn --dry-run merge -r123:120 

Für den Teil Frage, wie Sie eine Datei aus dem sVN zu entfernen, ohne die lokale Kopie zu entfernen:

svn rm foo.txt --keep-local 

Or , Natürlich, könnten Sie in eine temporäre Datei, bevor svn rm'ing einfach kopieren und kopieren Sie dann zurück:

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 
+0

Das Problem mit der Zusammenführung ist, dass es den vorherigen Verlauf der Datei verliert. svn cp, wie in Stefans Antwort beschrieben, ist wahrscheinlich besser und leichter zu verstehen. – Avi

+0

Große Antwort, rettete meinen Tag. Vielen Dank! pls1 –

+0

Ich fand, wenn die Versionsreihenfolge ändern, ist es nur die entfernte Datei zu aktuellen Arbeitskopie hinzufügen, ohne andere Änderung von keiner entfernten Datei, z. 'svn merge -r120: 123 svn_url .' – zhuguowei

30

Um eine Datei zu entfernen, aber es in der Arbeitskopie erhalten, verwenden

svn rm foo.txt --keep-local 

zu Wenn Sie eine Datei zurückgeschrieben haben, nachdem Sie das Entfernen festgeschrieben haben, können Sie entweder den Befehl zum Zusammenführen oder den Befehl zum Kopieren verwenden. Beides wird den Dateiverlauf beibehalten. Da die merge Weise bereits an anderer Stelle beschrieben ist, ist hier die Kopie Art und Weise:

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

Für mich zu arbeiten, muss der Kopierbefehl ein bisschen anders sein: svn cp url/to/removed/[email protected] foo.txt ---- ohne die @ 4 bekomme ich einen Fehler "Pfad nicht gefunden" – Barth

33

welchen Grund auch immer, die -r arg war nicht für mich arbeiten (SVN-Version 1.6.9). Ich habe vor und nach der src versucht, aber eine Meldung erhalten, dass die Datei in der aktuellen Revision nicht gefunden wurde (duh). Gleiches mit --Revision. obwohl daran gearbeitet, die @ style Syntax:

svn cp url/to/removed/[email protected] foo.txt 
+1

Das war der einzige Befehl, der für mich funktionierte. SVN 1.6.15 –

+0

Nie wissen, was ist die einfachste Möglichkeit, letzte Arbeitsversion zu bestimmen, aber diese Aussage ist Gold. –

1

i verwendet, um die Kopie Menüpunkt zur vorigen Revision mit Schildkröte, arbeitete für mich und hielt die Geschichte.

+1

Klingt vielversprechend, können Sie mehr Details geben? Von wo genau gibst du den Kopierbefehl aus? – VdesmedT

1

Um eine gelöschte Datei in SVN zurückzusetzen. Suchen Sie die Revisionsnummer kurz vor dem Löschen (sagen wir 341).Stellen Sie diese Datei dann auf diese Revisionsnummer zurück.

svn up -r341 [path_to_deletedFile] 
+0

Dies ruft eine andere lokale Kopie ab, aber die Datei bleibt im Repository "gelöscht". Dein nächstes "svn up" wird es verschwinden sehen. – UncaAlby

Verwandte Themen