Wie kehre ich in Subversion zu einer älteren Version unseres Codes zurück?

486

Ich arbeite mit einem Freund an einem Projekt und möchte zu einer älteren Version unseres Codes zurückkehren und ihn auf den aktuellen Stand setzen. Wie mache ich es?

Ich benutze "anksvn" auf vs08.

Ich habe die gewünschte Version auf meinem PC, aber das Festschreiben schlägt fehl. Die Meldung lautet "Festschreiben ist fehlgeschlagen, Datei oder Verzeichnis sind veraltet".

Ich habe auch den Subversion-Client auf meinem PC.

Chen Kinnrot
quelle

Antworten:

783

Grundsätzlich müssen Sie "rückwärts zusammenführen" - einen Unterschied zwischen der aktuellen und der vorherigen Version auf die aktuelle Version anwenden (so dass Sie eine Arbeitskopie erhalten, die der alten Version ähnelt) und dann erneut festschreiben. So gehen Sie beispielsweise von Revision 150 (aktuell) zurück zu Revision 140:

svn update
svn merge -r 150:140 .
svn commit -m "Rolled back to r140"

Das Subversion Red Book enthält einen guten Abschnitt dazu .

Jon Skeet
quelle
3
Die Zusammenführung überschreibt jedoch nicht meine Änderungen und die neue Revision.
Chen Kinnrot
76
Wenn Sie TortoiseSVN verwenden, klicken Sie mit der rechten Maustaste auf die Datei, wählen Sie Zusammenführen und dann Zusammenführen eines Revisionsbereichs. Geben Sie im Protokollfeld 140-150 ein und aktivieren Sie das Kontrollkästchen Umkehren. Danach wie gewohnt festschreiben. Dies führt die gleiche Operation wie in Jons Beispiel aus.
DavGarcia
8
Mit Eclipse und Subclipse können Sie mit der rechten Maustaste auf Ihr Projekt Team / Show History klicken, dann die Revisionen auswählen, die Sie "rückgängig machen" möchten, und mit einem weiteren Rechtsklick "Änderungen von ausgewählten Revisionen zurücksetzen" auswählen.
Fego
36
Um von der Kopfrevision zurückzukehren, können Sie auch schreiben svn merge -r HEAD:140.
Sschmeck
3
@ DavGarcias TortoiseSVN-Anweisungen waren für mich nicht richtig, zumindest nicht alle Dateien in einer Revision zurückzusetzen (mit TortoiseSVN 1.8.8). Klicken Sie mit der rechten Maustaste auf den Ordner und wählen Sie TortoisSVN-> Protokoll anzeigen. Wählen Sie die Revision (en) aus, die Sie zurücksetzen möchten, und klicken Sie mit der rechten Maustaste auf "Änderungen von dieser Revision zurücksetzen". Übernehmen Sie die Änderungen.
Mhenry1384
178

Sie können neue Änderungen nur am Anfang des Subversionsverlaufs festschreiben.

Der Grund, warum Sie mit der guten Kopie, die Sie auf Ihrem PC haben, nichts direkt tun können, ist, dass es so ist .svn Ordner wissen, dass es sich um Code aus der Vergangenheit handelt. Daher ist vor jedem ein Update erforderlich.

Finden Sie die gute Versionsnummer und kehren Sie zurück

  1. Suchen Sie die Versionsnummer der gewünschten alten Kopie.

    Holen Sie sich Ihre aktuelle Revision mit:

    svn info --show-item revision
    # or
    svn log

    Um ältere Versionen Ihres Projekts zu überprüfen , verwenden Sie:

    svn update -r <earlier_revision_number>

    bis Sie die richtige Revisionsnummer finden.

  2. Notieren Sie sich die gute Versionsnummer (unter der Annahme der folgenden 123Beispiele).

  3. Update auf die neueste Version:

    svn update
  4. Machen Sie alle Änderungen zwischen der gewünschten Revision und der neuesten Version rückgängig:

    svn merge -r HEAD:123 .
    svn commit "Reverted to revision 123"

    (Das gleiche wie Jon Skeets Antwort oben.)

Wenn Sie die Versionsnummer nicht finden können

Wenn Sie die alte Kopie nicht finden können und nur die aktuell auf Ihrem PC befindlichen Dateien festschreiben möchten:

  1. Erstellen Sie eine Kopie Ihrer guten Version (jedoch ohne .svnOrdner):

    cd ..
    rsync -ai --exclude=.svn  project/  project-good/
  2. Stellen Sie jetzt sicher, dass Sie die neueste Version haben:

    cd project
    svn update
    # or make a fresh checkout
    svn checkout <url>
  3. Kopieren Sie Ihre gute Version über die Arbeitskopie.

    Dieser Befehl kopiert und löscht auch alle Dateien aus dem Arbeitsbaum, die nicht in Ihrer guten Kopie enthalten sind, wirkt sich jedoch nicht auf die vorhandenen .svnOrdner aus.

    cd ..
    rsync -ai --exclude=.svn --delete  project-good/  project/

    Wenn Sie nicht über rsync verfügen, können Sie es verwenden, cp -aaber Sie müssen auch unerwünschte Dateien manuell löschen.

  4. Sie sollten in der Lage sein, das zu tun, was Sie jetzt haben.

    cd project
    svn commit "Reverted to good copy"
joeytwiddle
quelle
2
svn interpretiert es nicht als Modifikation, das kann ich nicht festlegen.
Sandburg
svn merge -r HEAD: 12345. ist der richtige Befehl zum Zurücksetzen, kein Update durchführen -r. Du verrückte Person.
Eule
Ich denke, diese Antwort wurde von Leuten positiv bewertet, die ihre Revisionsnummer nicht finden konnten oder die die führende Erklärung zu schätzen wussten. Ich habe die Antwort jetzt aktualisiert, um beide Ansätze einzuschließen.
Joeytwiddle
36

Verwenden Sie einfach diese Zeile

svn update -r yourOldRevesion

Sie können Ihre aktuelle Version kennen, indem Sie Folgendes verwenden:

svn info

M.Othman
quelle
15
Dies löst das Problem nicht. Stattdessen wird der Zustand erzeugt, in dem sich der Fragesteller zum Zeitpunkt der Beantwortung seiner Frage befand.
Ingo Schalk-Schupp
1
Wenn Sie das Pech hatten, diesen Rat zu befolgen, führen Sie Folgendes aus: "svn resolve --accept working -R."
Eule
27

Die Standardmethode zum Zusammenführen des gesamten Check-ins mit Merge funktioniert hervorragend, wenn Sie dies möchten. Manchmal möchten Sie jedoch nur eine einzelne Datei zurücksetzen. Es gibt keinen legitimen Weg, das zu tun, aber es gibt einen Hack:

  1. Suchen Sie die gewünschte Version mithilfe des SVN-Protokolls.
  2. Verwenden Sie den Export-Unterbefehl von svn:

    SVN-Export http: // URL in Ihre Datei @ 123 / tmp / Dateiname

(Wobei 123 die Versionsnummer für eine gute Version der Datei ist.) Verschieben oder kopieren Sie dann diese einzelne Datei, um die alte zu überschreiben. Checken Sie die geänderte Datei ein und Sie sind fertig.

Rechnung
quelle
Mit Tortoise-svn kann ich mit der rechten Maustaste auf eine einzelne Datei klicken und sie zusammenführen. Es sollte eine Möglichkeit geben, dies auch mit zu tun svn?
lc.
10
svn cat -r 123 path-in-your-working-copy > path-in-your-working-copy
dash17291
8

Ein bisschen altmodischer

svn diff -r 150:140 > ../r140.patch
patch -p0 < ../r140.patch

dann das übliche

svn diff
svn commit
Yauhen Yakimovich
quelle
5

Ich denke, das ist am besten geeignet:

Führen Sie die Zusammenführung beispielsweise rückwärts durch, wenn der festgeschriebene Code die Revision von Rev. 5612 bis 5616 enthält, und führen Sie sie einfach rückwärts zusammen. Es funktioniert an meinem Ende.

Zum Beispiel:

svn merge -r 5616:5612 https://<your_svn_repository>/

Es würde einen zusammengeführten Code enthalten, der auf die frühere Revision zurückgeht, dann könnten Sie ihn festschreiben.

hpal
quelle
3

Das habe ich getan und für mich gearbeitet.

Ich möchte die Änderungen in mehreren Commits, die ich für bestimmte Zeiten vorgenommen habe, rückgängig machen und zum vorherigen Commit-Punkt wechseln.

  1. Gehen Sie zu Team -> Verlauf anzeigen.
  2. Klicken Sie mit der rechten Maustaste auf den oder den Bereich der Revisionen, die Sie ignorieren möchten.
  3. Wählen Sie die Option "Änderungen rückgängig machen".

Dadurch wird eine umgekehrte Zusammenführung ausgeführt, wodurch die Änderungen in Ihrer Arbeitskopie rückgängig gemacht werden.

Überprüfen Sie einfach den Code und legen Sie fest.

Ziya
quelle
2

Klicken Sie mit der rechten Maustaste auf die höchste Hierarchie, die Sie zurücksetzen möchten >> RevertoderRevert to Revision

Yuval Adam
quelle
2

Bei den meisten vorherigen Antworten wurde eine umgekehrte Zusammenführung verwendet, und das ist normalerweise die richtige Antwort. Es gibt jedoch eine Situation (die mir gerade passiert ist), in der dies nicht der Fall ist.

Ich habe versehentlich eine Datei mit Unix-Zeilenenden in DOS-Zeilenenden geändert, als ich eine kleine Änderung vorgenommen habe, und sie festgeschrieben. Dies kann leicht rückgängig gemacht werden, entweder durch Ändern der Zeilenenden und erneutes Festschreiben oder durch umgekehrtes Zusammenführen. Dadurch wird die svn blameListe jedoch als Quelle für jede Zeile der Datei aufgelistet. (Interessanterweise ist TortoiseSVN unter Windows davon nicht betroffen, sondern nur die Befehlszeilesvn blame .)

Wenn Sie den von wie gemeldeten Verlauf beibehalten möchten, svn blamemüssen Sie meines Erachtens Folgendes tun:

  • Löschen Sie die Datei und schreiben Sie fest.
  • Kopieren Sie im Repository die vorherige gute Kopie der Datei in den Kopf und schreiben Sie sie fest.
  • Stellen Sie alle Änderungen wieder her, die Sie behalten möchten.

Das Löschen ist ein wenig beängstigend, aber denken Sie daran, dass Sie die Datei immer im Repository gespeichert haben, sodass das Wiederherstellen keine große Sache ist. Hier ist ein Code zur Veranschaulichung der Schritte. Angenommen, dies xxxist die Versionsnummer der letzten guten Kopie.

svn rm svn+ssh://path/to/file
svn copy svn+ssh://path/to/file@xxx svn+ssh://path/to -m"Restore good copy"
svn update
<restore the edits>
svn commit -m"Restore edits"

Beachten Sie, dass für eine Kopie im Repository das Ziel ein Verzeichnis und kein Dateiname sein muss.

user2554330
quelle
1

Klicken Sie mit der rechten Maustaste auf das Projekt> Ersetzen durch> Revision oder URL> Wählen Sie die spezifische Revision aus, die Sie zurücksetzen möchten.

Übertragen Sie nun die lokale Update-Code-Version in das Repository. Dadurch wird die Codebasis auf die spezifische Revision zurückgesetzt.

KayV
quelle
1

Auf dieser Seite gibt es viele gefährliche Antworten. Beachten Sie, dass seit SVN Version 1.6 ein Update -r zu Baumkonflikten führen kann, die schnell zu einem potenziell kafkeresken Albtraum führen, in dem Sie nach Informationen zu Baumkonflikten suchen.

Der richtige Weg, um zu einer Version zurückzukehren, ist:

svn merge -r HEAD:12345 .

Wobei 12345 die Versionsnummer ist. Vergiss den Punkt nicht.

Eule
quelle
0

Mit der älteren Version synchronisieren und festschreiben. Dies sollte den Trick tun.

Hier finden Sie auch eine Erklärung zum Rückgängigmachen von Änderungen.

Mork0075
quelle
0

Jon Skeets Antwort ist so ziemlich die Lösung auf den Punkt gebracht, aber wenn Sie wie ich sind, möchten Sie vielleicht eine Erklärung. Das Subversion-Handbuch nennt dies a

Cherry-Pick Merge

Aus den Manpages.

  1. Diese Form wird als "Cherry-Pick" -Zusammenführung bezeichnet: "-r N: M" bezieht sich auf den Unterschied in der Geschichte des Quellzweigs zwischen den Revisionen N und M.

    Ein "umgekehrter Bereich" kann verwendet werden, um Änderungen rückgängig zu machen. Wenn sich Quelle und Ziel beispielsweise auf denselben Zweig beziehen, kann eine zuvor festgeschriebene Revision rückgängig gemacht werden. In einem umgekehrten Bereich ist N in '-r N: M' größer als M, oder die Option '-c' wird mit einer negativen Zahl verwendet: '-c -M' entspricht '-r M:'. Das Rückgängigmachen solcher Änderungen wird auch als "Reverse Merge" bezeichnet.


  • Wenn es sich bei der Quelle um eine Datei handelt, werden Unterschiede auf diese Datei angewendet (nützlich, um frühere Änderungen rückwärts zusammenzuführen). Wenn die Quelle ein Verzeichnis ist, ist das Ziel standardmäßig '.'.

    Im normalen Gebrauch sollte die Arbeitskopie bei einer einzigen Überarbeitung auf dem neuesten Stand sein, ohne lokale Änderungen und ohne geschaltete Teilbäume.

Beispiel:

svn merge -r 2983:289 path/to/file

Dadurch wird die lokale Kopie [2983] (die gemäß dem obigen Zitat mit dem Server synchronisiert sein sollte - in Ihrer Verantwortung) durch die Revision 289 vom Server ersetzt. Die Änderung erfolgt lokal. Wenn Sie also eine saubere Kaufabwicklung haben, können die Änderungen vor dem Festschreiben überprüft werden.

Jonathan Komar
quelle
-1

Folgendes hat für mich funktioniert.

Ich hatte viele lokale Änderungen und musste diese in der lokalen Kopie verwerfen und die letzte stabile Version in SVN auschecken.

  1. Überprüfen Sie den Status aller Dateien, einschließlich der ignorierten Dateien.

  2. Durchsuchen Sie alle Zeilen, um die neu hinzugefügten und ignorierten Dateien abzurufen.

  3. Ersetzen Sie diese durch //.

  4. und rm -rf alle Zeilen.

    svn status --no-ignore | grep '^ [? I]' | sed "s / ^ [? I] //" | xargs -I {} rm -rf "{}"

shah1988
quelle