Wie kann ich ein SVN-Commit zurücksetzen?

303

Ich habe verschiedene Beispiele gefunden, wie man ein SVN-Commit wie zurücksetzt

svn merge -r [current_version]:[previous_version] [repository_url]

oder

svn merge -c -[R] .

Aber keiner von ihnen scheint zu funktionieren. Ich habe diese Befehle ausprobiert und die Dateien überprüft, die von Hand geändert wurden.

Wie kann ich ein Commit mit der Revisionsnummer 1944 zurücksetzen? Wie überprüfe ich, ob das Zurücksetzen durchgeführt wurde (ohne in der tatsächlichen Datei nachzuschauen, ob die Änderungen zurückgesetzt wurden)?

Alex
quelle
16
Haben Sie nie eine Antwort akzeptiert, weil keiner von ihnen funktioniert hat?
2rs2ts
4
Wenn Sie eine wörtliche Antwort wünschen, verwenden Sie "svn merge -c -1944". Um zu überprüfen, ob es funktioniert hat: "svn diff"
John Sampson
Was ist, wenn der Fall, ich habe 1943 (gutes Commit), dann 1944 (schlechtes Commit), dann 1945 (gutes Commit), dann 1946 (gutes Commit). Jetzt möchte ich nur 1944 entfernen (schlechtes Commit) und alle Revisionen nach 1944 beibehalten. Das bedeutet, ich möchte ein Ergebnis wie 1943, 1945, 1946 (nur 1944 entfernen) aus all diesen Revisionen. Was soll ich tun?
Bhavin_m

Antworten:

448

Beide Beispiele müssen funktionieren, aber

svn merge -r UPREV:LOWREV . Bereich rückgängig machen

svn merge -c -REV . Einzelne Revision rückgängig machen

in dieser Syntax - wenn das aktuelle Verzeichnis WC ist und (wie in muss nach jeder Zusammenführung durchgeführt werden) Sie Ergebnisse festschreiben

Möchten Sie Protokolle sehen?

Fauler Dachs
quelle
9
@ Dwjohnston - Ja, Zusammenführungen werden immer im WC durchgeführt und es ist keine serverseitige Aufgabe
Lazy Badger
14
svn: Merge source required. Kein Würfel.
2rs2ts
27
@ 2rs2ts sieht so aus, als hätten Sie den nachfolgenden Punkt vergessen, um "dies im aktuellen Verzeichnis tun" zu kennzeichnen.
Dalin
14
Sie können auch mehrere einzelne Commits gleichzeitig svn merge -c -42587,-42589 .
ausführen
1
@ahnbizcad - Revision (Single), die Sie rückgängig machen möchten
Lazy Badger
130

Wenn Sie den TortoiseSVN- Client verwenden, können Sie dies einfach über das Dialogfeld "Protokoll anzeigen" tun .

dodgy_coder
quelle
5
Dies ist bei weitem der einfachste Weg, dies zu tun
Markku K.
5
Das ist veraltet. In der aktuellen Version ist für den Client kein Kontextmenü mehr verfügbar.
user1789573
19
Was? TortoiseSVN ist ein Kontextmenü sowie die Dialoge, die es erzeugt. Was meinst du mit "es gibt kein Kontextmenü mehr"? Das gibt es mit Sicherheit!
Ben
@Ben Ich denke, user1789573 wurde ein bisschen über die explizite Erwähnung von "Kontextmenü" in dem Tutorial, auf das in der Antwort verwiesen wird, gestolpert.
Tom Catullo
2
Falls Sie dies später sehen, ist es (noch) da. Klicken Sie im Bildschirm "Protokoll anzeigen" mit der rechten Maustaste auf die Revision, und es gibt die Option "Auf diese Revision zurücksetzen". Dies ist in TortoiseSVN 1.9.4 Build 27285. Ich habe es gerade verwendet und kann Ihnen sagen, dass es gut funktioniert.
Bruce Van Horn
65

svn merge -r 1944:1943 .sollte die Änderungen von r1944 in Ihrer Arbeitskopie zurücksetzen. Sie können dann die Änderungen in Ihrer Arbeitskopie (mit Diff) überprüfen, müssen jedoch einen Commit durchführen, um die Wiederherstellung auf das Repository anzuwenden.

onon15
quelle
4
Funktioniert nicht, erfordert Zusammenführungsquelle. Versucht svn merge -r 1944:1943 .stattdessen, aber nichts hat sich geändert.
Alex
Hat sich das Repository seit r1944 weiterentwickelt? Wenn ja, gibt es widersprüchliche Änderungen in denselben Zeilen wie die Änderungen zwischen r1943 und r1944?
onon15
Ich bin bei der Revision 1945 und es scheint keinen Konflikt zu geben. Weder svn statusnoch svn diffgibt etwas.
Alex
7
Fehler:svn: Try 'svn help' for more info svn: Merge source required
Alex
5
Aber svn merge -r 1945:1943 .scheint funktioniert zu haben. Ich glaube, ich verstehe: Sie müssen die Version von "vor" dem "schlechten" Commit in Ihr Arbeits-Repository zusammenführen. Dies ist in Ordnung, wenn Sie das vorherige Commit einfach zurücksetzen möchten. Was aber, wenn Sie die mit Version 1900 vorgenommenen Änderungen rückgängig machen möchten?
Alex
45

Stellen Sie zunächst die Arbeitskopie auf 1943 zurück.

> svn merge -c -1943 .

Zweitens überprüfen Sie, was festgeschrieben werden soll.

> svn status

Drittens Commit-Version 1945.

> svn commit -m "Fix bad commit."

Viertens schauen Sie sich das neue Protokoll an.

> svn log -l 4

------------------------------------------------------------------------
1945 | myname | 2015-04-20 19:20:51 -0700 (Mon, 20 Apr 2015) | 1 line

Fix bad commit.
------------------------------------------------------------------------
1944 | myname | 2015-04-20 19:09:58 -0700 (Mon, 20 Apr 2015) | 1 line

This is the bad commit that I made.
------------------------------------------------------------------------
1943 | myname | 2015-04-20 18:36:45 -0700 (Mon, 20 Apr 2015) | 1 line

This was a good commit.
------------------------------------------------------------------------
Shaun Luttin
quelle
1
Was ist, wenn der Fall, ich habe 1943 (gutes Commit), dann 1944 (schlechtes Commit), dann 1945 (gutes Commit), dann 1946 (gutes Commit). Jetzt möchte ich nur 1944 entfernen (schlechtes Commit) und alle Revisionen nach 1944 beibehalten. Das bedeutet, ich möchte ein Ergebnis wie 1943, 1945, 1946 (nur 1944 entfernen) aus all diesen Revisionen. Was soll ich tun?
Bhavin_m
26

Es ist unmöglich, eine Revision "aufzuheben", aber Sie können Ihre Arbeitskopie auf Version 1943 zurücksetzen und diese als Version 1945 festschreiben. Die Versionen 1943 und 1945 sind identisch, wodurch die Änderungen effektiv rückgängig gemacht werden.

Jakub Zaverka
quelle
18
Um ärgerlich genau zu sein, würde ich sagen, dass Sie "die Festschreibung aufheben" können, wenn Sie Administratorzugriff auf das Repository haben. Dies durch Erstellen eines Klon-Repositorys bis zu einer bestimmten Revision mit svn dumpund dann svn load. Aber dies sollte natürlich nicht unter normalen Umständen verwendet werden.
onon15
4
Ich möchte das Commit nicht aufheben, sondern eine neue Commit-Nummer mit einem bestimmten invertierten Commit erstellen. Sets sagen, ich habe Version 1944 ausgecheckt, 1945 ein Commit gemacht, das ich "zurücksetzen" möchte. Dann möchte ich eine Version 1946 haben, deren Dateien mit denen in Version 1944 identisch sind. (Außer natürlich die Geschichte.) Aber die Frage bleibt: Wie geht das? Was sind die Befehle?
Alex
//, @Alex, das interessiert mich auch, besonders an etwas Analogem $ git revert. Ich fand es etwas schwierig, SVN zu lernen, nachdem ich Git so lange benutzt hatte.
Nathan Basanese
10

Das Folgende führt einen Trockenlauf durch, wie es heißt. HEAD ist die aktuelle Version, PREV ist die vorherige, dann der Pfad zu Ihrer Datei oder dem festgeschriebenen Element:

svn merge --dry-run -rHEAD:PREV https://example.com/svn/myproject/trunk

Wenn der Trockenlauf gut aussieht, führen Sie den Befehl ohne den --dry-run aus

Überprüfen Sie die Änderung in der Revision und schreiben Sie sie erneut fest. Um nach Versionsnummern zu suchen, versuchen Sie:

svn log
BentheFolker
quelle
4
F=code.c
REV=123
svn diff -c $REV $F | patch -R -p0 \
    && svn commit -m "undid rev $REV" $F
jmullee
quelle
Muss sich die lokale Kopie von der fehlerhaften Revision unterscheiden?
Eliezer Miron
2

Alex, versuchen Sie Folgendes: svn merge [WorkingFolderPath] -r 1944: 1943

Nikita
quelle
2

Während die bereits gegebenen Vorschläge für einige Leute möglicherweise funktionieren, funktioniert sie für meinen Fall nicht. Bei der Durchführung der Zusammenführung synchronisieren Benutzer, bei rev 1443denen ein Update durchgeführt wird rev 1445, weiterhin alle geänderten Dateien 1444, obwohl sie den Angaben 1443aus der Zusammenführung entsprechen. Ich brauchte Endbenutzer, um das Update überhaupt nicht zu sehen.

Wenn Sie das Commit vollständig ausblenden möchten, können Sie einen neuen Zweig mit der richtigen Revision erstellen und dann die Zweige austauschen. Das einzige, was Sie tun müssen, ist, alle Sperren zu entfernen und erneut hinzuzufügen.

copy -r 1443 file:///<your_branch> file:///<your_branch_at_correct_rev>
svn move file:///<your_branch> file:///<backup_branch>
svn move file:///<your_branch_at_correct_rev> file:///<your_branch>

Das hat bei mir funktioniert, vielleicht ist es für jemand anderen da draußen hilfreich =)

Droxxodia
quelle
2
svn merge -c -M PATH

Das hat mir das Leben gerettet.

Ich hatte das gleiche Problem, nachdem ich zurückgesetzt hatte, sah ich auch keinen alten Code. Nachdem ich den obigen Befehl ausgeführt habe, habe ich einen sauberen alten Versionscode erhalten.

Amit Ghosh
quelle
1

Ich habe das oben genannte versucht, ( svn merge) und du hast recht, es macht Jack. jedoch

svn update -r <revision> <target> [-R]

scheint zu funktionieren, ist aber nicht permanent (mein svn zeigt einfach eine alte revision). Also musste ich

mv <target> <target backup>
svn update <target>
mv <target backup> <target>
svn commit -m "Reverted commit on <target>" <target>

In meinem speziellen Fall ist mein Ziel interfaces/AngelInterface.php. Ich habe Änderungen an der Datei vorgenommen, sie festgeschrieben, den Build-Computer aktualisiert, auf dem der PHPDOC-Compiler ausgeführt wurde, und festgestellt, dass meine Änderungen Zeitverschwendung waren. svn log interfaces/AngelInterface.phpzeigt meine Änderung als r22060 und das vorherige Commit für diese Datei war r22059. Also kann ich svn update -r 22059 interfaces/AngelInterface.phpund am Ende habe ich wieder Code wie in -r22059. Dann :-

mv interfaces/AngelInterface.php interfaces/AngelInterface.php~
svn update interfaces/AngelInterface.php
mv interfaces/AngelInterface.php~ interfaces/AngelInterface.php
svn commit -m "reverted -r22060" interfaces/AngelInterface.php

Alternativ könnte ich dasselbe in einem Verzeichnis tun, indem ich . -Ranstelle interfaces/AngelInterface.phpaller oben genannten Angaben mache .

sibaz
quelle
1
Eine andere Sache, wie bereits gesagt, ist, dass Sie das Commit nicht aus dem Verlauf entfernen können, wie Sie es in Git tun können, indem Sie die Refs direkt hacken. Alles, was Sie tun können, ist, das Repository zu verwenden, um Ihre Quelle so zu ändern, wie Sie es beabsichtigen, und dies als Änderung festzuschreiben.
Sibaz
Nach weiteren Untersuchungen kann ich feststellen, dass es möglich ist, das Commit mit svnadmin aus dem Verlauf zu entfernen, aber Sie werden dringend davon abgeraten. Siehe stackoverflow.com/questions/5566327/…
sibaz
0

Wenn Sie Commits vollständig aus dem Verlauf entfernen möchten, können Sie das Repo auch bei einer bestimmten Revision sichern und dann diesen Speicherauszug importieren. Speziell:

svnrdump dump -r 1:<rev> <url> > filename.dump

Der Befehl svnrdump hat dieselbe Funktion wie der Befehl svnadmin dump, funktioniert jedoch auf einem Remote-Repo.

Als nächstes importieren Sie einfach die Dump-Datei in das Repo Ihrer Wahl. Dies wurde getestet, um bei Beanstalk gut zu funktionieren.

Redcalfee
quelle