web-dev-qa-db-de.com

Setzen Sie das gesamte svn-Repository auf eine ältere Version zurück

Ich habe mein SVN-Repository durcheinander gebracht und muss nun das gesamte Repository von Revision 28 auf 24 zurückstellen und möchte mich nicht mit Differenzen oder Konflikten befassen. Gibt es eine schnelle und einfache Möglichkeit, dies zu tun? Ich war in der Lage, einzelne Dateien vor dem Ausführen des Befehls "Zusammenführen" wiederherzustellen. In diesem Fall möchte ich jedoch alle Dateien aus Version 28 wieder in das Repository einfügen, wenn ich sie wirklich löschen möchte.

Ich verwende die Befehlszeile in einer Linux-Box (Bash).

Vielen Dank

EDIT

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 einen Sicherungsort und verschieben Sie das repo.fixed in das Repo.

Danke noch einmal!

74
nlaq

Überprüfen Sie svnadmin dump/load. Mit jeder Version Ihrer Dateien wird eine Textdatei erstellt. Es kann möglich sein, alles über/unter einem bestimmten Punkt zu löschen und erneut zu importieren.

Siehe zum Beispiel Migration von Repository-Daten an anderer Stelle

26
Justin Love

Eine "umgekehrte" Zusammenführung kann das sein, was Sie brauchen. Siehe "Änderungen rückgängig machen" von svn book.

Z.B. svn merge -r 28:24 [pfad zu svn]

25
luapyad

Wenn Sie wirklich "Beweise" für das Vorhandensein der Dateien löschen müssen, 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 Reverse Merge verwenden. Damit stellen Sie sicher, dass das Rückgängigmachen der Änderungen nach r24 auch rückgängig gemacht werden kann.

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

svn merge -r 28:24
14
Sander Rijken

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

13
fuenfundachtzig

Wenn Sie keine Admin-Rechte in Anspruch nehmen, können Sie keine alten Revisionen auslöschen, ABER Sie können sie dennoch mit nur einem erstaunlich einfachen "svn copy" -Befehl extrem gut ausblenden.

svn Löschprotokoll: // svnserver/einige/resource
svn copy protocol: // svnserver/einige/resource @ 24 protokoll: // svnserver/einige/resource

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 copy protocol: // svnserver/some/verzeichnis @ 24 protokoll: // svnserver/some /

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

6
MarcH

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

  • Änderungsprotokoll anzeigen
  • klicken Sie mit der rechten Maustaste auf die Revision, auf die Sie zurückkehren möchten.
  • ... wählen Sie "Auf diese Version zurücksetzen"
  • bestätigen Sie Ihre Änderungen

Diese Methode behält den Versionsverlauf (d. H. Alle von Ihnen zurückgegebenen Versionen) bei.

5
Paul Suart

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

svn co path/to/my/repo -r 24
3
nickf

Wenn Sie wirklich Dateien vollständig aus dem Repository entfernen möchten, müssen Sie einen svndump in eine Datei ausführen, die nicht gewünschten Revisionen und/oder Dateipfade herausfiltern, ein neues Repo erstellen und den gefilterten Dump in die neue Datei laden Repository. Lesen Sie den Abschnitt SVN-Buch zur Repository-Wartung sorgfältig durch, bevor Sie dies tun, und stellen Sie sicher, dass Sie das vorhandene Repo nicht entfernen, bis Sie sicher sind, dass das neue Repo das Zeug enthält, das Sie haben wollen.

2
genehack

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

2
neesh

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?

1
Juan

hier ist, wie ich anfangen würde, es zu tun. Brutal, ja, aber es ist das Einzige, das garantiert Kollisionen vollständig ignoriert. Und Hält den Revisionsverlauf intakt.

  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 ist, einen Zweig aus einer alten Version zu erstellen und diesen Zweig dann wieder in den Kopf einzufügen. (zumindest ist es so verwendet zu arbeiten)

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

1
Kent Fredric

Könnten Sie svn del die obersten Verzeichnisse, dann svn copy sie:

svn copy [email protected] svnurl 
1
Lyndon

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

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

svn update -r 24 trunk

Dabei ist 24 die Versionsnummer und trunk die Datei/der Ordner, die Sie aktualisieren (oder in diesem Fall wiederherstellen) möchten.

In meinem Test wurden mehrere Dateien aktualisiert und (erneut) hinzugefügt. 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, raten Sie mir bitte. 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

0
Dave
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 /[email protected] 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]/[email protected] svn://[RepoName]/trunk -m "Copy of correct revision of trunk to HEAD"
0
Mazrick