Besserer Weg, um zu einer früheren SVN-Revision einer Datei zurückzukehren?

167

Ich habe versehentlich zu viele Dateien in ein SVN-Repository übertragen und einige Dinge geändert, die ich nicht wollte. (Seufz.) Um sie wieder in ihren vorherigen Zustand zu versetzen, war das Beste, was ich mir einfallen lassen konnte

svn rm l3toks.dtx
svn copy -r 854 svn+ssh://<repository URL>/l3toks.dtx ./l3toks.dtx

Herrgott! Gibt es keinen besseren Weg? Warum kann ich nicht einfach so etwas schreiben:

svn revert -r 854 l3toks.dtx

Okay, ich verwende nur Version 1.4.4, aber ich habe die Änderungsliste für den 1.5-Zweig überflogen und konnte nichts sehen, was direkt damit zusammenhängt. Habe ich etwas vergessen?


Edit: Ich glaube ich war nicht klar genug. Ich glaube nicht , ich will merge umkehren, denn dann werde ich die Änderungen verloren , dass ich habe machen wollen! Sagen Sie das fileAund fileBwurden beide modifiziert, aber ich wollte nur begehen fileA; versehentlich tippen

svn commit -m "small change"

schreibt beide Dateien fest, und jetzt möchte ich ein Rollback durchführen fileB. Das umgekehrte Zusammenführen macht diese Aufgabe nicht einfacher (soweit ich das beurteilen kann) als die oben beschriebenen Schritte.

Will Robertson
quelle
Mögliches Duplikat von Wie kann ich ein SVN-Commit zurücksetzen?
Vadzim

Antworten:

243
svn merge -r 854:853 l3toks.dtx

oder

svn merge -c -854 l3toks.dtx

Die beiden Befehle sind äquivalent .

orip
quelle
5
Vielen Dank dafür, ich wollte nur etwas angeben - sagen wir, ich bin bei Revision 855, ich möchte eine Datei auf Revision 854 zurücksetzen. Wenn ich dies tue svn merge -c -854 my.fileund dann tue svn diff, scheint es eine Revision vor 854 (dh 853) anzuzeigen ); nur wenn ich es tue svm merge -c 854 myfile(ohne das -), sieht es so aus, als ob myfile auf rev 854 zurückgesetzt wird. Nochmals vielen Dank, Prost!
Sdaau
11
Gibt es einen Grund, warum die erste Option oben für mich wie ein Zauber wirkte, während die zweite überhaupt nicht funktionierte?
Skybondsor
7
Vergessen Sie jedoch nicht, nach dem umgekehrten Zusammenführen ein Commit durchzuführen. Ich vergesse oft :)
Vineeth Pradhan
11
Wirklich sollte minus 1 dies sein, um nicht anzugeben, was der Unterschied zwischen diesen beiden Befehlen ist. Schlechte Antwort
Angry Dan
4
@ Sprog - wenn es einen Unterschied gibt, würde ich gerne wissen
Orip
34

Lesen Sie den Abschnitt " Änderungen rückgängig machen " im SVN-Buch

luapyad
quelle
5
Links zu externen Ressourcen werden empfohlen. Fügen Sie jedoch einen Kontext um den Link hinzu, damit Ihre Mitbenutzer eine Vorstellung davon haben, was es ist und warum es dort ist. Zitieren Sie immer den relevantesten Teil eines wichtigen Links, falls die Zielwebsite nicht erreichbar ist oder dauerhaft offline geht.
user2084795
32

Es tut mir leid, dass ich nur bei einer Wiederholung der zuvor gegebenen Antwort etwas Platz verbraucht habe - aber damit habe ich immer Probleme.

Angenommen, ich habe die lokalen Dateien auf die neueste Version aktualisiert, nämlich 854. Dann möchte ich eine ältere Version erhalten - die Version der Datei aus wenigen früheren Versionen, z. B. Version 851.

Kopie würde funktionieren:

svn copy -r 851 svn+ssh://<repository URL>/l3toks.dtx ./l3toks.dtx

.. aber ich kann mich nicht darum kümmern, nach der Repo-URL zu suchen :)

Das Update könnte anscheinend funktionieren:

svn up -r 851 ./l3toks.dtx

... es markiert jedoch auch die lokale Kopie als "frisch ausgecheckt" oder vielmehr "wie Online-Revision" (dh in Tortoise / RabbitVCS erhalten Sie ein grünes OK-Häkchen) - was bedeutet, dass Sie dies nicht tun können svn ci -m "rolled back to r 851": einfach, weil die lokale subversionDie ausführbare Datei bemerkt keine lokalen Änderungen und macht sich nicht die Mühe, etwas in das Online-Repository hochzuladen.

Und wie bereits beantwortet, funktioniert Reverse Merge - aber in diesem Fall sollte man sich nicht auf die Verknüpfungssyntax verlassen. aber konkret angeben:

svn merge -r HEAD:851 l3toks.dtx
--- Reverse-merging r854 through r852 into 'l3toks.dtx':
U    l3toks.dtx

Ich muss zugeben - ich würde den Satz " Reverse-Merging von r854 bis r852 in Datei " niemals so verstehen, dass er "Ich habe gerade r851 Ihrer Datei erhalten und alles überschrieben, was Sie zuvor lokal hatten - und er ist als anders als die letzte Online-Revision gekennzeichnet Sie können es als neue 'Rollback'-Revision wieder online einchecken ", aber ich denke (und hoffe :)), dass es das ist :)

Danach kann man svn diffschnell sicherstellen, dass wir vor Ort die richtige Revision erhalten haben. Außerdem wird die Datei in Tortoise / RabbitVCS (dh anders als in der neuesten festgeschriebenen Version) mit einem roten Ausrufezeichen gekennzeichnet und svn ci -m "rolled back to r 851"kann dieses Mal ausgeführt werden.

Beachten Sie auch, dass Sie, wenn Sie nach dem umgekehrten Zusammenführen endlich Ihre Meinung ändern ( dh Sie möchten trotzdem weiter an der neuesten HEAD-Revision arbeiten, hier 854 -, nachdem Sie lokal auf 851 zurückgesetzt haben, aber den Rollback noch nicht festgeschrieben haben ) sollten Sie nicht verwenden svn up, da lediglich angegeben wird, dass es sich bereits um " Bei Revision 854 " handelt. stattdessen verwenden svn revert --recursive .oder ähnlich ...

Prost!

Ref: Zurücksetzen von Änderungen mit Subversion - Jacob Wright - Flex, AIR, PHP usw.

EDIT: ... und anscheinend kann genau der gleiche Effekt svn merge -r HEAD:851 l3toks.dtxerzielt werden mit:

svn export -r 851 l3toks.dtx
A    l3toks.dtx
Export complete.
sdaau
quelle
2
Sie sollten den SVN-Export IMMER bevorzugen, da er genau das tut, was Sie möchten - überprüfen Sie eine Datei in einer bestimmten Revision, während beim umgekehrten Zusammenführen auch versucht wird, Ihre lokalen Änderungen mit der angegebenen Version zusammenzuführen. Dies ist eine komplexe und verrückte Operation fehleranfällig, wenn Sie nicht aufpassen!
Falco
1
Ich hatte Probleme mit dem umgekehrten Zusammenführen. Anstatt herauszufinden warum, habe ich nur versucht zu exportieren und es hat perfekt funktioniert. Ich würde nur empfehlen, nur den Export zu verwenden. Sie können --forceVerzeichnisse überschreiben. Denken Sie daran, dass alle Änderungen überschrieben werden.
Nick
Sehr gute Erklärung, was tatsächlich passiert! Ich benutze AnkhSVN und TortoiseSVN häufig und sehe nirgendwo etwas, von dem ich Gebrauch machen kann. Fehlt svn exportmir etwas oder ist das in diesen GUIs einfach nicht implementiert?
Conrad
@Conrad, Sie verwenden dies, indem Sie in AnkhSVN auf "Exportieren ..." und in TortoiseSVN auf "Exportieren" in Ihrem Repository-Kontextmenü (Rechtsklick) klicken
nitinr708
10

Ich musste kürzlich auf eine bestimmte Revision zurückgreifen, um einen älteren Build zu debuggen, und das funktionierte wie Magie:

svn up -r 3340 (or what ever your desired revision number)

Ich musste alle Konflikte mit der Option "tc" lösen, da mir lokale Änderungen egal waren (alles, was mir wichtig war, vor dem Zurücksetzen eingecheckt)

Es war auch einfach, zur Kopfrevision zurückzukehren:

svn up
Igor
quelle
5

Was Sie suchen, wird als "Reverse Merge" bezeichnet. Sie sollten die Dokumente zur Zusammenführungsfunktion im SVN-Buch konsultieren (wie luapyad, genauer gesagt der erste Kommentator zu diesem Beitrag, hervorhebt). Wenn Sie Tortoise verwenden, können Sie auch einfach in die Protokollansicht gehen und mit der rechten Maustaste klicken und "Änderungen aus dieser Revision zurücksetzen" für diejenige auswählen, bei der Sie den Fehler gemacht haben.

rmeador
quelle
4

Reverse Merge ist genau das, was Sie wollen (siehe luapyads Antwort). Wenden Sie die Zusammenführung einfach auf die fehlerhaft festgeschriebene Datei anstatt auf das gesamte Verzeichnis an.

Tom
quelle
4

Wenn Sie nur das letzte Einchecken rückgängig machen möchten, können Sie Folgendes verwenden

svn merge -r head:prev l3toks.dtx

Auf diese Weise müssen Sie nicht nach den aktuellen und vorherigen Versionsnummern suchen.

Ken Russell
quelle
4

svn merge führt Revisionen zusammen und nicht zurück. Wenn Sie also eine Ergänzung in Ihrer HEAD-Version haben und diese mit einer früheren Revision zusammenführen, bleibt die Änderung bestehen.

Ich benutze svn cat und leite es dann in die Datei um:

svn cat -r 851 l3toks.dtx > l3toks.dtx

Dann haben Sie den 851-Inhalt in dieser Datei und können ihn wieder einchecken.

Dylan
quelle
3

Wenn Sie die Eclipse-IDE mit dem SVN-Plugin verwenden, haben Sie folgende Möglichkeiten :

  1. Klicken Sie mit der rechten Maustaste auf die Dateien, die Sie zurücksetzen möchten (oder auf den Ordner, in dem sie enthalten waren, wenn Sie sie versehentlich gelöscht haben und sie wieder hinzufügen möchten).
  2. Wählen Sie " Team> Switch "
  3. Wählen Sie die Radion-Schaltfläche "Revision" und geben Sie die Revisionsnummer ein, zu der Sie zurückkehren möchten. OK klicken
  4. Wechseln Sie zur Perspektive Synchronisieren
  5. Wählen Sie alle Dateien aus, die Sie zurücksetzen möchten
  6. Klicken Sie mit der rechten Maustaste auf die Auswahl und führen Sie " Überschreiben und Festschreiben ... " aus.

Dadurch werden die Dateien auf die gewünschte Revision zurückgesetzt. Denken Sie daran, dass SVN die Änderungen als neues Commit ansieht. Das heißt, die Änderung erhält eine neue Revisionsnummer, und es besteht keine Verbindung zwischen der alten und der neuen Revision. Sie sollten in den Festschreibungskommentaren angeben, dass Sie diese Dateien auf eine bestimmte Revision zurücksetzen.

Ceiroa
quelle