2010-05-11 9 views
145

Ich habe eine Datei wie unten in einem SVN-Repo gezeigt, die ich auf eine vorherige Version zurücksetzen möchte. Wie kann man das in SVN machen? Ich möchte nur diese bestimmte Datei auf eine ältere Version herunterstufen, nicht das gesamte Repo.Einzelne Datei in SVN zu einer bestimmten Revision zurückführen

Danke.

$ svn log myfile.py 
---------------------- 
r179 | xx | 2010-05-10 

Change 3 
---------------------- 
r175 | xx | 2010-05-08 

Change 2 
---------------------- 
r174 | xx | 2010-05-04 

Initial 
+0

Wenn Sie sagten, zurück, was meinst du, vor 7 Jahren, lol –

Antwort

161

Wenn Sie nur die alte Datei in Ihrer Arbeitskopie wollen:

svn up -r 147 myfile.py 

Wenn Sie Rollback möchten, finden Sie dieses "How to return to an older version of our code in subversion?".

+6

, aber das nächste Mal, wenn Sie es aktualisieren erhalten Sie die Datei, die Sie nicht wollten zurück ...: S – andygoestohollywood

+1

wenn Sie es nicht zurück wollen, svn commit diese Datei, um die gewünschte Version in den Repo zu setzen –

+12

Dies tut wahrscheinlich nicht wirklich, was der Fragesteller wollte. Damit ist die Arbeitskopie sauber und kann nicht wie vorliegend übergeben werden, und ein "svn update" ohne die angegebene Versionsnummer ruft die neueste, unerwünschte Version ab. – CXJ

49

Für eine einzelne Datei könnten Sie tun:

svn export -r <REV> svn://host/path/to/file/on/repos file.ext

Sie svn revert <file> tun konnte, aber das wird die letzte Arbeitskopie nur wiederherstellen.

+2

exportieren, dann fügen Sie es in Ihre lokale Kopie, dann erneut ein Commit? – tgkprog

+0

@tgkprog das ist ein Weg, es zu tun, ja –

+0

@tgkprog und was ist der "bevorzugte" Weg? – hbogert

13

Der beste Weg ist:

svn merge -c -RevisionToUndo ^/trunk 

Dadurch werden alle Dateien der Revision rückgängig machen, als nur jene Datei wiederherstellen Sie nicht mögen, rückgängig zu machen. Vergessen Sie nicht den Bindestrich (-) als Präfix für die Revision.

svn revert File1 File2 

Jetzt die Änderungen rückgängig machen.

5

Ich fand es einfach über den Befehl svn cat, so dass Sie nicht einmal eine Revision angeben müssen.

svn cat mydir/myfile > mydir/myfile 

Dies wird wahrscheinlich nicht die Inode (Metadaten) Daten wie Timestamps zurückrollen.

+0

Commit dann die Datei, so dass es zum Repo geht – tgkprog

+2

Das funktionierte für mich besser als das Update. Da Sie mit update nicht die an dieser Datei vorgenommenen Änderungen festschreiben können. (svn 1.8.3) –

44
svn revert filename 

Dies sollte eine einzelne Datei wiederherstellen.

+2

Was ist los mit all den anderen Antworten mit längeren Befehlen? Vielen Dank. – masterxilo

+0

Gern geschehen. Ich habe keine Ahnung, was los ist mit anderen Antworten .. lol – thestar

+0

sie sind auf, und sie sind länger. Ich stimme zu. –

41

svn cat nimmt eine revision arg auch!

svn cat -r 175 mydir/myfile > mydir/myfile

+0

Das hat gut funktioniert. Vielen Dank. –

+11

** Dies ist bei weitem die beste Antwort auf der Seite. ** Es bleibt die geänderte Datei in einem Zustand, der festgeschrieben werden kann. – dotancohen

+0

das scheint nicht zu funktionieren, wenn Sie in eine neue Datei einfügen – ahnbizcad

12

Bisher alle hier Antworten scheinen signifikante Nachteile zu haben, sind kompliziert (müssen die Repo-URI finden), oder sie tun nicht, was die Frage wahrscheinlich gefragt: Wie wird die Repo in einem bekommen Arbeitszustand wieder mit dieser älteren Version der Datei.

svn merge -r head:[revision-number-to-revert-to] [file-path] ist IMO der sauberste und einfachste Weg, dies zu tun. Bitte beachten Sie, dass das Zurücksetzen einer gelöschten Datei auf diese Weise nicht funktioniert [1]. Siehe auch die folgende Frage: Better way to revert to a previous SVN revision of a file?

[1], dass Sie svn cp -r [rev-number] [repo-URI/file-path]@[rev-number] [repo-URI/file-path] && svn up wollen, siehe auch What is the correct way to restore a deleted file from SVN?

+0

Ich möchte darauf hinweisen, dass 'svn merge' zumindest für meine Version von Subversion aus irgendeinem Grund nicht mehrere Dateien als Argument akzeptiert. In diesem Fall scheint es nichts zu tun (ohne eine Fehlermeldung). – Wrzlprmft

+0

Aber mein Befehl funktioniert immer noch, indem ich es für jede Datei wiederhole, richtig? –

+0

Ja, tut es tatsächlich. – Wrzlprmft

3

Wenn es nur ein paar Dateien ist, und wenn Sie Tortoise SVN verwenden, können Sie den folgenden Ansatz verwenden :

  1. Klicken Sie mit der rechten Maustaste auf Ihre Quelldatei und wählen Sie "TortoiseSVN" -> "Show log".
  2. Klicken Sie mit der rechten Maustaste auf eine Revision im Protokoll und wählen Sie "Revision speichern unter ...".
  3. Lassen Sie die alte Version Ihre aktuelle Datei überschreiben.
  4. Übernehmen Sie die überschriebene Quelldatei.
+0

Dadurch wird eine neue nicht versionierte Datei wie Datei-xxxx gespeichert, wobei xxxx die alte Revisionsnummer ist. Was machen wir als nächstes? Löschen Sie die neue Revision (HEAD z. B.), benennen Sie die neue Datei um, fügen Sie hinzu, commit? – Heinz

+0

Nein, speichern Sie es nicht mit der Revisionsnummer im Dateinamen. Speichern Sie es mit genau demselben Dateinamen wie die aktuelle Version der gleichen Datei (mit anderen Worten, keine xxxx im Dateinamen). Dann machen Sie danach einen gewöhnlichen Commit. – Elling

3

überrascht niemand erwähnte dies

ohne die Revisionsnummer herauszufinden Sie diese schreiben könnte, wenn man nur engagierte etwas, das Sie, das wird nicht funktionieren zurückkehren möchten, wenn Sie eine andere Datei und die Zieldatei geändert ist nicht die letzte Änderung

svn merge -r PREV:HEAD file 
+0

Wenn Sie Kommentare haben, besprechen Sie diese bitte hier, bevor Sie Änderungen vornehmen? –

+0

Erfordert das Szenario in der Frage nicht eine umgekehrte Zusammenführung der letzten Änderung, so dass wir die Änderungen anwenden sollten, die benötigt werden, um von HEAD nach PREV zu wechseln? –

+0

Der Befehl sollte 'svn zusammenführen -r HEAD: PREV-Datei' als @Nick Russo sagte – Heinz

2

gerade hinzufügen, auf @Mitch Dempsy Antwortdatei, da ich noch nicht genug rep zu kommentieren.

svn export -r <REV> svn://host/path/to/file/on/repos --force 

Hinzufügen der --force wird die lokale Kopie mit dem Export überschreiben und dann können Sie eine svn tun begehen sie in das Repository zu schieben.

+0

und das ist die beste Antwort :) – Zgr3doo

1

Sie wollen

svn merge -r [revision to revert from]:[revision to revert to] [path/filename]

tun, wenn Sie das tun, müssen Sie diese Version der Datei in einem committable Zustand. Übergeben Sie die Datei.