it-swarm.com.de

Wie kann ich ein SVN-Commit zurücksetzen?

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 von Hand geänderten Dateien überprüft.

Wie kann ich ein Commit mit der Revisionsnummer 1944 zurücksetzen? Wie überprüfe ich, ob die Wiederherstellung durchgeführt wurde (ohne in der aktuellen Datei nachzuschauen, ob die Änderungen wiederhergestellt wurden)?

289
Alex

Beide Beispiele müssen funktionieren, aber

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

svn merge -c -REV . macht eine einzelne Revision rückgängig

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

Möchten Sie Protokolle sehen?

429
Lazy Badger

Wenn Sie den Client TortoiseSVN verwenden, ist dies einfach über das Dialogfeld "Protokoll anzeigen" .

127
dodgy_coder

svn merge -r 1944:1943 . sollte die Änderungen von r1944 in Ihrer Arbeitskopie rückgängig machen. Sie können dann die Änderungen in Ihrer Arbeitskopie (mit Diff) überprüfen, müssen jedoch ein Commit ausführen, um die Wiederherstellung in das Repository anzuwenden.

59
onon15

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.
------------------------------------------------------------------------
41
Shaun Luttin

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

26
Jakub Zaverka

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 zu dem festgeschriebenen Element:

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

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

Überprüfen Sie die Änderung in der Revision und wiederholen Sie den Commit. So suchen Sie nach Versionsnummern:

svn log
9
BentheFolker
F=code.c
REV=123
svn diff -c $REV $F | patch -R -p0 \
    && svn commit -m "undid rev $REV" $F
3
jmullee

Während die bereits gegebenen Vorschläge für einige Leute funktionieren können, funktioniert es für meinen Fall nicht. Während der Zusammenführung synchronisieren Benutzer von rev 1443, die auf rev 1445 aktualisieren, weiterhin alle in 1444 geänderten Dateien, obwohl sie 1443 aus der Zusammenführung entsprechen. Ich brauchte Endbenutzer, um das Update überhaupt nicht zu sehen.

Wenn Sie das Festschreiben vollständig ausblenden möchten, können Sie einen neuen Zweig mit der richtigen Revision erstellen und dann die Zweige austauschen. Sie müssen nur alle Sperren entfernen und wieder hinzufü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 hilft es jemand anderem =)

2
droxxodia
svn merge -c -M PATH

Das hat mir das Leben gerettet.

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

2
amit ghosh

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

2
Nikita

Ich habe es oben 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, den PHP-Compiler ausgeführt und festgestellt, dass meine Änderungen Zeitverschwendung waren. svn log interfaces/AngelInterface.php zeigt meine Änderung als r22060 und das vorherige Commit für diese Datei war r22059. Also kann ich svn update -r 22059 interfaces/AngelInterface.php und bekomme 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 . -R anstelle von interfaces/AngelInterface.php in allen oben genannten Optionen eingebe.

1
sibaz

Wenn Sie Commits vollständig aus dem Verlauf entfernen möchten, können Sie auch einen Speicherauszug des Repos bei einer bestimmten Revision erstellen 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-Repository.

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

0
redcalfee