Zurücksetzen einer einzelnen Datei in SVN auf eine bestimmte Revision

180

Ich habe eine Datei wie unten in einem SVN-Repo gezeigt, die ich auf eine frühere Version zurücksetzen möchte. Wie geht das in SVN? Ich möchte nur diese bestimmte Datei auf eine ältere Version herunterstufen, nicht das gesamte Repo.

Vielen Dank.

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

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

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

Initial
Gökhan Sever
quelle
als du gesagt hast
rückgängig zu machen

Antworten:

181

Wenn Sie nur die alte Datei in Ihrer Arbeitskopie haben möchten:

svn up -r 147 myfile.py

Wenn Sie einen Rollback durchführen möchten, lesen Sie den Abschnitt " Wie kann ich in Subversion zu einer älteren Version unseres Codes zurückkehren? ".

Eric Hauser
quelle
8
aber das nächste Mal, wenn Sie aktualisieren, erhält es die Datei, die Sie nicht zurück haben wollten ...: S
andygoestohollywood
2
Wenn du es nicht zurück haben willst, svn diese Datei festschreiben, um die gewünschte Version in das Repo
Packet Tracer
14
Dies macht wahrscheinlich nicht das, was der Fragesteller wollte. Auf diese Weise ist die Arbeitskopie sauber und kann nicht wie besehen festgeschrieben werden. Bei einem "SVN-Update" ohne die angegebene Versionsnummer wird die neueste, unerwünschte Version abgerufen.
CXJ
1
Wie kann ich dann die zurückgesetzte Datei festschreiben?
Marcio
2
Dies ist nicht ganz richtig, da es, wie CXJ erwähnt, keine Möglichkeit gibt, die aktualisierte Datei festzuschreiben. Sie möchten wahrscheinlich tun, was Mitch Dempsey sagt (beachten Sie jedoch die --force, um das Überschreiben der Datei zu erzwingen): svn export --force -r 147 myfile.py myfile.py
avejidah
75

svn cat nimmt auch ein revisionsarg!

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

Niemals wieder schlafen
quelle
19
Dies ist bei weitem die beste Antwort auf der Seite. Die geänderte Datei bleibt in einem Zustand, der festgeschrieben werden kann.
Dotancohen
Dies scheint nicht zu funktionieren, wenn Sie in eine neue Datei
einfügen
haha im rückblick, idk an welchen kontext ich gedacht habe als ich gepostet habe. Ich kann mich nicht erinnern. Es scheint unsinnig.
Ahnbizcad
Dies ist einfach und unkompliziert, wenn Sie Ihre Änderungen einfach rückgängig machen und eine Datei ohne technische Probleme bei der Versionskontrolle wieder in den Zustand vor dem Festschreiben versetzen möchten.
Anonym
57
svn revert filename 

Dies sollte eine einzelne Datei zurücksetzen.

der Stern
quelle
4
Was ist mit all den anderen Antworten mit längeren Befehlen los? Vielen Dank.
Masterxilo
Bitte schön. Ich habe keine Ahnung, was mit anderen Antworten
los ist
13
Dies kehrt zu welcher Revision zurück? Doc sagt, ersetzt nur durch die neuesten Repo. Die Frage ist, wie man zu einer früheren Version zurückkehrt.
Tgkprog
1
Dies wird auf die neueste Version von Repo zurückgesetzt. Wenn Sie die Beschreibung der Fragen lesen, scheint er nach einer Möglichkeit gesucht zu haben, eine einzelne Datei und nicht das gesamte Verzeichnis zurückzusetzen.
Thestar
5
Ich glaube, alles, was dies bewirkt, ist, Ihre Arbeitskopie zu zerstören, indem Sie sie wieder auf den Kopf zurücksetzen. Oder zu welchem ​​jemals ausgecheckt wurde. Bestätigen Sie mit svn update -r VER und führen Sie dann eine svn-Wiederherstellung durch.
Gerard ONeill
49

Für eine einzelne Datei können Sie Folgendes tun:

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

Sie können dies tun, svn revert <file>aber dadurch wird nur die letzte Arbeitskopie wiederhergestellt.

Mitch Dempsey
quelle
2
exportieren, dann in Ihre lokale Kopie einfügen und dann erneut festschreiben?
Tgkprog
1
@tgkprog das ist eine Möglichkeit, es zu tun, ja
Mitch Dempsey
@tgkprog und was ist der "bevorzugte" Weg?
Hbogert
Keine Ahnung, aber genau das hat bei mir funktioniert: Exportiert nach der letzten Revision. Im Editor geöffnet, kopiert, in die Arbeitsdatei eingefügt. Verpflichtet, das mit Kommentar zu welcher Rev und warum zu leiten. UI-Tools haben möglicherweise einen besseren Weg.
Tgkprog
20

Bisher scheinen alle Antworten hier erhebliche Nachteile zu haben, sind kompliziert (müssen den Repo-URI finden) oder sie tun nicht das, was die Frage wahrscheinlich gestellt hat: Wie man das Repo mit dieser älteren Version des wieder in einen funktionierenden Zustand versetzt 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ückbringen einer gelöschten Datei auf diese Weise nicht zu funktionieren scheint [1]. Siehe auch die folgende Frage: Besserer Weg, um zu einer früheren SVN-Revision einer Datei zurückzukehren?

[1] Informationen dazu finden Sie svn cp -r [rev-number] [repo-URI/file-path]@[rev-number] [repo-URI/file-path] && svn upauch unter Wie kann eine gelöschte Datei aus SVN korrekt wiederhergestellt werden?

Michel Müller
quelle
Ich möchte darauf hinweisen, dass zumindest für meine Version von Subversion svn mergeaus irgendeinem Grund nicht mehrere Dateien als Argument verwendet werden. In diesem Fall scheint es einfach nichts zu tun (ohne eine Fehlermeldung).
Wrzlprmft
Aber mein Befehl funktioniert immer noch, indem ich ihn für jede Datei wiederhole, oder?
Michel Müller
Ja, das tut es tatsächlich.
Wrzlprmft
1
Einverstanden, dass dies das sauberste ist.
KevinG
13

Der beste Weg ist:

svn merge -c -RevisionToUndo ^/trunk

Dadurch werden alle Dateien der Revision rückgängig gemacht, anstatt nur die Dateien zurückzusetzen, die Sie nicht rückgängig machen möchten. Vergiss den Bindestrich nicht (- ) als Präfix für die Revision.

svn revert File1 File2

Übernehmen Sie nun die Änderungen zurück.

khmarbaise
quelle
9

Du willst machen

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

Sobald Sie dies tun, haben Sie diese Revision der Datei in einem festschreibbaren Zustand. Übernehmen Sie die Datei.

Jennifer Elyse
quelle
7

Ich fand es einfach, dies über den svn catBefehl zu tun, so dass Sie nicht einmal eine Revision angeben müssen.

svn cat mydir/myfile > mydir/myfile

Dadurch werden die Inode-Daten (Metadaten) wie Zeitstempel wahrscheinlich nicht zurückgesetzt.

Joseph Coco
quelle
begehen Sie dann die Datei , so dass es an den Repo geht
tgkprog
3
Das hat bei mir besser funktioniert als das Update. Da Sie mit dem Update die an dieser Datei vorgenommenen Änderungen nicht festschreiben können. (svn 1.8.3)
fe_lix_
7

überrascht, dass niemand dies erwähnte

Ohne die Revisionsnummer herauszufinden, könnten Sie dies schreiben. Wenn Sie nur etwas festgeschrieben haben, das Sie zurücksetzen möchten, funktioniert dies nicht, wenn Sie eine andere Datei geändert haben und die Zieldatei nicht die zuletzt geänderte Datei ist

svn merge -r HEAD:PREV file
Kalpesh Soni
quelle
Wenn Sie Kommentare haben, besprechen Sie diese bitte hier, bevor Sie Änderungen vornehmen.
Kalpesh Soni
1
Erfordert das Szenario in der Frage nicht eine umgekehrte Zusammenführung der letzten Änderung, sodass wir die Änderungen anwenden sollten, die erforderlich sind, um von HEAD zu PREV zu wechseln?
Nick Russo
4
Der Befehl sollte sein, svn merge -r HEAD:PREV filewie @Nick Russo sagte
Heinz
4

Wenn es sich nur um ein paar Dateien handelt und 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" -> "Protokoll anzeigen".
  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. Überschreiben Sie die überschriebene Quelldatei.
Elling
quelle
Dadurch wird eine neue nicht versionierte Datei wie file-xxxx gespeichert, wobei xxxx die alte Versionsnummer ist. Was machen wir als nächstes? neue Revision löschen (zB HEAD zB), neue Datei umbenennen, hinzufügen, festschreiben?
Heinz
Nein, speichern Sie es nicht mit der Versionsnummer im Dateinamen. Speichern Sie es mit genau demselben Dateinamen wie die aktuelle Version derselben Datei (mit anderen Worten, kein xxxx im Dateinamen). Dann machen Sie einfach ein gewöhnliches Commit danach.
Elling
4

Ich füge nur die Antwort von @Mitch Dempsy hinzu, da ich noch nicht genug Repräsentanten habe, um einen Kommentar abzugeben.

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

Durch Hinzufügen von --force wird die lokale Kopie beim Export überschrieben. Anschließend können Sie ein SVN-Commit ausführen, um sie in das Repository zu übertragen.

Kristina
quelle
und das ist die beste Antwort :)
Zgr3doo
Warum ist das die beste Antwort? es verwaltet die Geschichte nicht auf "svn way"
Jason S
2

Eine alternative Option für eine einzelne Datei besteht darin, die aktuelle Version der Datei durch die ältere Version zu "ersetzen":

svn rm file.ext
svn cp svn://host/path/to/file/on/repo/file.ext@<REV> file.ext
svn ci

Dies hat die zusätzliche Funktion, dass die unerwünschten Änderungen nicht im Protokoll für diese Datei angezeigt werden (dh svn log file.ext).

Robert Leland
quelle
1

Wenn Sie eine einzelne Datei aus einer bestimmten Revision zurücksetzen und festschreiben möchten, gehen Sie wie folgt vor:

svn merge -c - [OldRev #] [Dateiname]

dh. svn merge -c -150 myfile.py

Beachten Sie das Negativ auf der Versionsnummer

Olmstov
quelle
-1
sudo svn revert filename

Dies ist der bessere Weg, um eine einzelne Datei zurückzusetzen

mallikarjun SK
quelle
1
Ich hoffe wirklich, dass Sie nie einer Produktionsmaschine mit Sudoer-Berechtigungen nahe kommen.
David Lakatos