Führen Sie ein Rollback durch oder setzen Sie das gesamte SVN-Repository auf eine ältere Version zurück

75

Ich habe mein SVN-Repository durcheinander gebracht und muss nun das gesamte Repository von Revision 28 auf 24 zurücksetzen und möchte mich nicht mit Unterschieden oder Konflikten befassen. Gibt es eine schnelle und einfache Möglichkeit, dies zu tun? Ich konnte einzelne Dateien mit dem Befehl "Zusammenführen" zurücksetzen, bevor dies in Ordnung war. In diesem Fall möchte ich jedoch alle Dateien aus Version 28 wieder in das Repository aufnehmen, wenn ich sie nur löschen möchte.

Ich benutze die Kommandozeile auf einer Linux-Box (Bash).

Vielen Dank

BEARBEITEN

Danke für all die Hilfe! Ich habe es behoben durch:

svnadmin create /svnroot/<repo>.fixed
svnadmin dump -r 1:24 /svnroot/<repo> --incremental > dump.svn
svnadmin load /svnroot/<repo>.fixed < dump.svn

Legen Sie dann das alte Repo an einem Sicherungsort ab und verschieben Sie das repo.fixed in das Repo.

Danke noch einmal!


quelle
3
Ich wollte mich nur dafür bedanken. Ich lerne svn und habe es vermasselt, einige Verzeichnisse zu verschieben (es stellte sich heraus, dass ich es aus einem bestimmten Grund anders gemacht hatte!) Und ich wollte, dass es weg ist. Ihre Frage hat mir viel Ärger erspart.
AgentConundrum
Vielen Dank, ich glaube, das funktioniert, aber es dauert so lange, wenn Ihr Repository über 10.000 Revisionen verfügt. :(
Amir Pashazadeh

Antworten:

26

Überprüfen Sie svnadmin dump / load. Es wird eine Textdatei mit jeder Version Ihrer Dateien erstellt. Möglicherweise können Sie alles über / unter einem bestimmten Punkt löschen und erneut importieren.

Siehe beispielsweise Migrieren von Repository-Daten an anderer Stelle

Nur verliebt
quelle
2
Ich sehe mir das gerade an, danke. Natürlich musste ich versehentlich svnadmin dump eingeben, ohne es weiterzuleiten, sodass jetzt mein gesamtes Projekt in stdin geschrieben wird (und nicht mit Strg + c aufhört) ... Ich werde diesen Fehler nicht noch einmal machen: p
OK; Ich bin jetzt auf dem richtigen Weg, danke! Aber wie kann ich es so machen, dass meine Revisionen erhalten bleiben? Ich habe ein Perl-Skript geschrieben, das für 1 bis 24 "svnadmin dump -r $ i: $ i + 1 <repos>> Datei", dann "svnadmin load <repos> <file" und nur Revision 1
1
Stellen Sie sicher, dass Sie die Guid Ihres Repositorys ändern, während Sie Ihr Backup neu laden, wenn Sie den Verlauf ändern. Andernfalls könnten Sie alte Arbeitskopien mit einer geänderten Datenbank verwenden und später auf mysteriöse Weise kaputte Revisionen erhalten (da diese auf Deltas basieren, die auf nicht mehr vorhandenen Versionen basieren).
Bert Huijben
25

Eine "umgekehrte" Zusammenführung kann das sein, was Sie brauchen. Siehe Abschnitt "Änderungen rückgängig machen" im SVN-Buch.

ZB svn merge -r 28:24 [Pfad zu svn]

luapyad
quelle
Die in 28 erstellten Dateien werden nicht gelöscht. Das Problem ist, dass ich eine Reihe von Dateien hinzugefügt habe, von denen ich nicht sollte. Ja, ich habe es wirklich vermasselt. Manuelles Verfolgen, was entfernt werden muss, kommt nicht in Frage. Ich möchte nur jede Umkehrung nach 24 "löschen".
2
Entschuldigung - ich muss Ihr Problem nicht ganz verstanden haben. Ich habe die umgekehrte Zusammenführung verwendet, um neu (aber falsch) hinzugefügte Dateien mehrmals zu entfernen ... (aber Ihr Fall muss geringfügig anders sein?) (Sie können normalerweise keine Revisionen aus dem SVN-Repo löschen - fügen Sie nur neue hinzu, die reparieren die Fehler).
Luapyad
Alles, was Sie tun müssen, ist wieder zusammenzuführen, wie die Antwort zeigt, und dann Ihr Projekt wieder in ( svn ci -m "Revering all changes back to revision X") zu überprüfen . Es ist weiterhin möglich, die fehlerhaften Revisionen auszuchecken. Dadurch wird jedoch die gewünschte Revision wieder bei HEAD angezeigt.
Paul Nelson Baker
14

Wenn Sie Zugriff auf den SVN-Server haben, können Sie ihn einfach bearbeiten path/db/current, die alte Revisionsnummer, zu der Sie zurückkehren möchten (hier: 24), dort ablegen und nicht mehr benötigte Revisionsdateien (dh 25, 26, 27, 28) aus entfernen path/db/revs/0/. Zumindest hat das heute bei mir funktioniert, nachdem ich versehentlich ein Verzeichnis im Repository entfernt hatte.

fuenfundachtzig
quelle
Bei weitem das schnellste und einfachste, und ich habe diesen Trick in der Vergangenheit angewendet. Es ist jedoch eine schlechte Angewohnheit, sich darauf einzulassen, und ich würde dies niemals auf einem Repo tun, das von jemand anderem verwendet wurde oder in dem kritische Daten enthalten waren. Es ist besser, die Admin-Tools ordnungsgemäß zu verwenden.
Tynam
Ich weiß nicht , alles, was könnte passieren, aber ich weiß , dass es möglich für sie Probleme später zu erstellen, weil ich einmal ein Problem mit hatte die nächsten begehen nach genau dies zu tun. Trotzdem habe ich es mehrmals erfolgreich gemacht, und natürlich haben Sie zuerst ein Backup Ihres Repos erstellt, oder? (Ein offensichtliches Problem ist natürlich, dass der Cache einer alten Arbeitskopie des Repo-Status nicht mit dem tatsächlichen Repo übereinstimmt, nachdem Sie dies getan haben. Führen Sie daher immer unmittelbar danach eine neue Kaufabwicklung durch und arbeiten Sie daran, da sonst die Wahrscheinlichkeit sehr gering ist Probleme beim
Festschreiben
Oh, das ist dreckig ... aber es scheint zu funktionieren. Ich musste jedoch laufen, um mich wieder festlegen svnadmin recover /path/to/repozu können.
lxg
Es ist erwähnenswert, dass die Dateien nur path/db/revs/0dann vorhanden sind, wenn Sie weniger als 1000 Commits haben. Wenn Sie mehr als das haben, sind die Dateien in path/db/revs/X, wobei X die Festschreibungsnummer geteilt durch 1000 ist
Michael Firth
13

Wenn Sie wirklich "Beweise" löschen müssen, dass die Dateien jemals existiert haben, müssen Sie die oben beschriebenen Aktionen svndump / svnload ausführen.

In einer "normalen" Situation, in der Sie einen Fehler gemacht haben, müssen Sie die umgekehrte Zusammenführung verwenden. Dadurch wird sichergestellt, dass das Rückgängigmachen der Änderungen nach r24 auch rückgängig gemacht, geändert usw. werden kann.

Der folgende Befehl sollte funktionieren, um Ihre Änderungen rückgängig zu machen (Sie müssen das Ergebnis der Zusammenführung festschreiben, um die Zusammenführung im Repository widerzuspiegeln).

svn merge -r 28:24
Sander Rijken
quelle
1
Haha, nun, ich könnte ins Detail gehen, wie dies keine "normale" Situation ist, aber ich würde mich lieber nicht weiter in Verlegenheit bringen
1
Die "abnormale" Situation wäre, wenn Sie etwas Geheimnisvolles begangen hätten, wie eine Datei mit einem Passwort oder so etwas; Sie möchten, dass das vollständig entfernt wird. Letzte Nachricht zu diesem Thema wurde am "svn obliterate"
Sander Rijken
6

Wenn Sie keine Administratorrechte in Anspruch nehmen, können Sie keine alten Revisionen auslöschen, ABER Sie können sie mit nur einem erstaunlich einfachen Befehl "svn copy" sehr gut ausblenden (nickf und JesperE haben dies bereits erwähnt, aber auf ziemlich kryptische Weise).

svn-Löschprotokoll: // svnserver / some / resource
svn-Kopierprotokoll: // svnserver / some / resource @ 24-Protokoll: // svnserver / some / resource

Und das war's, die Revisionen 25 bis 28 sind vollständig aus dem SVN-Protokoll verschwunden. Es ist überhaupt kein Hack, es ist eine sichere und (kaum ...) dokumentierte Funktion.

Wenn "Ressource" ein Verzeichnis ist, müssen Sie es von der letzten URL entfernen:

SVN-Kopierprotokoll: // SVN-Server / einige / Verzeichnis @ 24 Protokoll: // SVN-Server / einige /

(sonst würden Sie es in sich selbst kopieren)

März
quelle
Wenn der svn copy prot://srv/path/proj ...Befehl , den Sie einen Fehler wie den gibt „svn: E170000: ... ist nicht im selben Repository als ...“ , dann können Sie arbeiten-um es durch ein Tun svn checkout prot://srv/path/proj@321 coolverdann svn copy coolver/proj prot://srv/path/; # ftw!
MarkHu
5

Für jeden, der TortoiseSVN verwendet, ist die Lösung einfach:

  • Änderungsprotokoll anzeigen
  • Klicken Sie mit der rechten Maustaste auf die Revision, zu der Sie einen Rollback durchführen möchten ...
  • ... wählen Sie "Zu dieser Revision zurückkehren"
  • Übernehmen Sie Ihre Änderungen

Diese Methode behält den Versionsverlauf bei (dh alle von Ihnen zurückgesetzten Revisionen).

Paul Suart
quelle
Ich habe mehr oder weniger das verwendet, was Sie hier gesagt haben, weil der Versionsverlauf beibehalten wurde, aber ich habe den Quellcode meiner Arbeitskopie gelöscht und dann "Elemente auf Revision aktualisieren" ausgewählt (weil "Auf diese Revision zurücksetzen" nicht beendet wurde die Dateien, die nach der Überarbeitung erstellt wurden). Tolle Lösung für TortoiseSVN-Benutzer :)
Ignacio Rubio
Ich bin mir ziemlich sicher, dass es um das Löschen der Geschichte ging
MarcH
Diese Option existiert nicht in TortoiseSVN, zumindest nicht im Jahr 2018.
Rockin4Life33
3

Sie können eine bestimmte Revision erneut auschecken. http://svnbook.red-bean.com/de/1.1/re04.html

svn co path/to/my/repo -r 24
nickf
quelle
Ich habe das bereits getan, aber es weigert sich, als neue Revision wieder auf das Repository zurückzugreifen. Ist das möglich? Dh Revision 29 zu einer Kopie von Revision 24 machen?
Ja. Der Befehl svn copy kann Repo -> Repo-Kopien ausführen. Überprüfen Sie "svn help copy" für die genaue Syntax.
JesperE
2

Wenn sich die Ordnerstruktur Ihrer Anwendung nicht geändert hat, checken Sie die alte Version aus und ersetzen Sie die .svn-Ordner von der letzten Version in die ausgecheckte alte Version. Jetzt können Sie die "ältere" Version festschreiben.

neesh
quelle
2
Klingt für mich ehrlich gesagt wie ein Hack.
Sander Rijken
Leider hat sich die Ordnerstruktur erheblich geändert, sonst würde ich nur manuell löschen, was gelöscht werden musste. Vielen Dank für die Eingabe.
1
Ich bin damit einverstanden, dass es ein Hack ist. Da dies jedoch eine einmalige Situation ist, bin ich mir nicht sicher, ob ich nach der elegantesten Lösung suchen würde. Etwas schnelles und einfaches würde ausreichen.
Neesh
1

Wenn Sie Dateien wirklich vollständig aus dem Repository entfernen möchten, müssen Sie einen Svndump in eine Datei ausführen, die nicht gewünschten Drehzahlen und / oder Dateipfade herausfiltern, ein neues Repo erstellen und den gefilterten Dump in das neue laden Repository. Bevor Sie dies tun, sollten Sie den Abschnitt zum SVN-Buch über die Repository-Wartung sorgfältig lesen und sicherstellen, dass Sie das vorhandene Repo erst entfernen, wenn Sie sicher sind, dass das neue das gewünschte Material enthält.

Genehack
quelle
1

Könnten Sie svn deldie obersten Verzeichnisse, dann svn copysie:

svn copy svnurl@version svnurl 
Lyndon
quelle
0

Ich hasse es, das zu sagen, aber das ist eine Situation, in der ich Backups meines SVN-Repositorys verwendet habe.

Können Sie Dateien einer bestimmten Revision in ein neues Verzeichnis im Repository kopieren?


quelle
Backup SVN klingt selbst albern, aber es klingt so, als ob ich das an erster Stelle tun sollte: /
Ich habe SVN-Repositories beschädigt bekommen, und es macht keinen Spaß. Ich mache häufig Backups und lege Kopien in einen Safe bei der Bank.
Das Sichern ist eine gute Vorgehensweise, aber das Wiederherstellen vom Backup in dieser Situation sollte nicht erforderlich sein.
Sander Rijken
0

Hier ist, wie ich anfangen würde, es zu tun. Brutal, ja, aber es ist das einzige, was garantiert ist, Kollisionen vollständig zu ignorieren und den Revisionsverlauf intakt zu halten.

  cd /scratchdir 
  svn co -r good svn://repository
  cd /hosed_project
  svn up -r HEAD
  cat >> /tmp/cp.sh 
  ORIG=$1
  TARG=$( echo $ORIG | sed 's/\/scratchdir\///' ); 
  cp $ORIG /hosed_project/$TARG;
  ^D
  chmod u+x /tmp/cp.sh
  find /scratchdir -not -wholename "*/.svn*" -exec /tmp/cp.sh {} \;

Beachten Sie, dass dies nicht der "normale" Weg ist, IMO. Der normale Weg besteht darin, einen Zweig aus einer alten Version zu erstellen und diesen Zweig dann wieder in den Kopf einzufügen. (Zumindest war es so so funktioniert)

Bearbeiten: Der obige Code ist nicht getestet, führen Sie ihn NICHT wörtlich aus

Kent Fredric
quelle
0

Ich bin mir nicht ganz sicher, ob diese Arbeit funktioniert, da ich sie noch nicht in einer Live-Produktion verwendet habe, aber ich habe gerade ein Test-Repository ausprobiert (ich habe eines meiner Produktions-Repository kopiert) und es scheint zu funktionieren.

Wenn Sie sich in Ihrem Repository befinden, verwenden Sie den folgenden Befehl:

svn update -r 24 trunk

Wobei 24 die Revisionsnummer und die Amtsleitung ist die Datei / der Ordner, die Sie auf diese Revisionsnummer aktualisieren (oder in diesem Fall wiederherstellen) möchten.

In meinem Test wurden mehrere Dateien aktualisiert und (erneut) hinzugefügt, und nach einem Commit erhielt ich keinerlei Warnungen. Ich habe dann eine Datei mit einem Dummy-Text geändert und ein weiteres Commit versucht, und nur diese Datei ist in der geänderten Liste aufgetaucht. Es scheint also ziemlich gut zu funktionieren!

Auch dies habe ich vorher nicht in Live-Produktionen verwendet. Wenn ich mich irre, bitte um Rat. Ich würde gerne wissen, ob dies auch der richtige Weg ist, denn ich kann mir vorstellen, dass ich dies in (naher) Zukunft brauche.

-Dave


quelle
Dies aktualisiert nur Ihre Arbeitskopie auf diese ältere Version und bietet keine Möglichkeit, dies wie oben angegeben festzuschreiben.
Sander Rijken
Bist du sicher? Ich habe dies in einer Testumgebung versucht, und es schien in Ordnung zu sein? Ich könnte mich jedoch irren.
Wenn die Datei nach r24 überarbeitet wurde und Sie sie ändern, kann svn keine Änderungen daran vornehmen und verlangt, dass Sie zuerst auf HEAD aktualisieren
Wim Coenen
0
Example:
    Rev 100 all is working great        
    Rev 101 somebody really corrupted the dir structure and / or merged in bad changes, etc.
    Rev 102 You delete /trunk
    Rev 103 You copy /trunk@100 to HEAD
        You now have a /trunk that reflects only Rev 100 and 103. Not 101 or 102.

svn del svn://[RepoName]/trunk -m "removing issue in HEAD"
svn copy svn://[RepoName]/trunk@100 svn://[RepoName]/trunk -m "Copy of correct revision of trunk to HEAD"
Mazrick
quelle