Hoe zet ik een SVN-commit terug?

Ik heb verschillende voorbeelden gevonden van hoe je een SVN-commit kunt terugdraaien, zoals

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

of

svn merge -c -[R] .

Maar geen van beide lijkt te werken. Ik heb die commando’s geprobeerd en de bestanden gecontroleerd die met de hand waren gewijzigd.

Hoe zet ik een commit met revisienummer 1944 terug? Hoe controleer ik of het terugzetten is gedaan (zonder in het daadwerkelijke bestand te kijken of de wijzigingen zijn teruggedraaid)?


Antwoord 1, autoriteit 100%

Beide voorbeelden moeten werken, maar

svn merge -r UPREV:LOWREV .bereik ongedaan maken

svn merge -c -REV .enkele revisie ongedaan maken

in deze syntaxis – als de huidige dir WC is en (zoals in moet na elke samenvoeging) worden de resultaten vastgelegd

Wilt u logboeken zien?


Antwoord 2, autoriteit 29%

Als je de TortoiseSVN-client gebruikt, is het gemakkelijk via het dialoogvenster Logboek weergeven.


Antwoord 3, autoriteit 15%

svn merge -r 1944:1943 .zou de wijzigingen van r1944 in je werkkopie moeten terugdraaien. Je kunt dan de wijzigingen in je werkkopie bekijken (met diff), maar je moet een commit doen om de terugzetting in de repository toe te passen.


Antwoord 4, autoriteit 11%

Stel eerst de werkkopie terug naar 1943.

> svn merge -c -1943 .

Ten tweede, controleer wat er gaat gebeuren.

> svn status

Derde, commit versie 1945.

> svn commit -m "Fix bad commit."

Ten vierde, kijk naar het nieuwe logboek.

> 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.
------------------------------------------------------------------------

Antwoord 5, autoriteit 5%

Het is onmogelijk om een ​​revisie “uncommit” te maken, maar u kunt uw werkkopie terugzetten naar versie 1943 en dat vastleggen als versie 1945. De versies 1943 en 1945 zullen identiek zijn, waardoor de wijzigingen in feite ongedaan worden gemaakt.


Antwoord 6, autoriteit 2%

Het volgende zal een droge run doen, zoals het zegt. HEAD is de huidige versie, PREV is de vorige, dan het pad naar je bestand, of vastgelegd item:

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

Als de testrun er goed uitziet, voer je de opdracht uit zonder de –dry-run

Controleer de wijziging in de revisie en bevestig opnieuw. Probeer om naar versienummers te bladeren:

svn log

Antwoord 7

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

Antwoord 8

Hoewel de gegeven suggesties voor sommige mensen kunnen werken, werkt het niet voor mijn geval. Bij het uitvoeren van de samenvoeging synchroniseren gebruikers van rev 1443die updaten naar rev 1445nog steeds alle bestanden die zijn gewijzigd in 1444, ook al zijn ze gelijk aan 1443uit de samenvoeging. Ik wilde dat eindgebruikers de update helemaal niet zouden zien.

Als je de commit volledig wilt verbergen, is dat mogelijk door een nieuwe branch aan te maken bij de juiste revisie en dan de branches te verwisselen. Het enige is dat u alle vergrendelingen moet verwijderen en opnieuw moet toevoegen.

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>

Dit werkte voor mij, misschien is het nuttig voor iemand anders daar =)


Antwoord 9

svn merge -c -M PATH

Dit heeft mijn leven gered.

Ik had hetzelfde probleem, nadat ik terug was gegaan, zag ik ook geen oude code.
Na het uitvoeren van de bovenstaande opdracht kreeg ik een schone oude versiecode.


Antwoord 10

Alex, probeer dit: svn merge [WorkingFolderPath] -r 1944:1943


Antwoord 11

Ik heb het bovenstaande geprobeerd, (svn merge) en je hebt gelijk, het werkt wel. Maar

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

lijkt te werken, maar is niet permanent (mijn svn toont gewoon een oude revisie). Dus ik moest

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

In mijn specifieke geval is mijn doel interfaces/AngelInterface.php. Ik bracht wijzigingen aan in het bestand, zette ze vast, werkte de buildcomputer bij met de phpdoc-compiler en ontdekte dat mijn wijzigingen tijdverspilling waren. svn log interfaces/AngelInterface.phptoont mijn wijziging als r22060 en de vorige commit in dat bestand was r22059. Dus ik kan svn update -r 22059 interfaces/AngelInterface.phpen ik eindig met code zoals het was in -r22059 weer. Dan:-

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

Als alternatief zou ik hetzelfde kunnen doen in een directory, door . -Rin plaats van interfaces/AngelInterface.phpin al het bovenstaande.


Antwoord 12

Als je commits volledig uit de geschiedenis wilt verwijderen, kun je ook een dump van de repo doen bij een specifieke revisie, en dan die dump importeren. Specifiek:

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

De opdracht svnrdump heeft dezelfde functie als svnadmin dump, maar werkt op een externe opslagplaats.

Importeer vervolgens het dumpbestand in uw repo naar keuze. Dit werd getest om goed te werken op Beanstalk.


Antwoord 13

Heel oud draadje, maar er is geen antwoord voor Intellij. Om een ​​enkele commit terug te draaien:

Ga naar:
Subversie -> Directory integreren…


Antwoord 14

Merk op dat het svn mergecommando een commit terugdraait in de zin dat een andere commit je wijzigingen ongedaan maakt, maar je verkeerde commit in de geschiedenis houdt.

In het geval dat u een Subversion-systeembeheerder bent (met toegang via de opdrachtregel) en u een zeer grote foutmoet terugdraaien (bijvoorbeeld iemand heeft iets begaan dat niet zonder reden in de wereld), en als je wilt proberen om koste wat kost een commit volledig te laten vallen, zelfs met het risico de repo te vernietigen:

Stap 1. Identificeer uw repository op uw server

Identificeer allereerst uw repository op het bestandssysteem van uw server.

Laten we aannemen dat de padnaam /repois. Maar het kan /home/svn/myrepozijn of iets dergelijks.

De structuur van het bestandssysteem zou er ongeveer zo uit moeten zien:

$ ls -la /repo
total 16
drwxr-xr-x.   6 svn svn   86 10 feb  2020 .
drwxrwx---. 145 svn svn 4096 22 giu 16.14 ..
drwxr-xr-x.   2 svn svn   54 10 feb  2020 conf
drwxr-sr-x.   6 svn svn  253 17 giu 11.25 db
-r--r--r--.   1 svn svn    2 10 feb  2020 format
drwxr-xr-x.   3 svn svn 4096 10 feb  2020 hooks
drwxr-xr-x.   2 svn svn   41 10 feb  2020 locks
-rw-r--r--.   1 svn svn  229 10 feb  2020 README.txt

Laten we ook aannemen dat uw gebruiker svnheet, zoals in het bovenstaande voorbeeld.

OPMERKING: als je niet weet waar dit over gaat, heb je waarschijnlijk geen eigen Subversion-server en is dit antwoord misschien niet nuttig voor jouw geval. Probeer andere antwoorden (waarbij je alleen de URL van de server nodig hebt, zonder fysieke toegang).

Stap 2. Exporteer uw goede geschiedenis

Laten we aannemen dat uw verkeerde revisie 100is en dat uw juiste versie 99is:

svnadmin dump -r 1:99 /repo > export.dump

Stap 3. Maak een back-up van uw repository en start deze opnieuw

Maak een back-up van uw repository en initialiseer deze opnieuw:

mv              /repo /repo.bak
mkdir           /repo
svnadmin create /repo

Stap 4. Importeer uw goede geschiedenis opnieuw

svnadmin load /repo < export.dump

Zorg er nu voor dat u uw rechten met de juiste gebruiker corrigeert:

chown -R svn:svn /repo

Werkt alles? Dat is alles! Goed voor je!

MAARop dit punt zijn er interessante kansen dat je je hele repository hebt vernietigd. U kunt bijvoorbeeld niet meer afrekenen, of uw Subversion-webtoepassing (Phabricator?) schreeuwt met vreemde foutmeldingen, of u kunt tijdens het proces per ongeluk duizend kittens hebben gedood.

Als er iets misgaatblijf klaar met uw noodherstel:

Rampherstel

Als zich een ramp voordoet:

mv /repo     /repo.fail
mv /repo.bak /repo

In de hoop nuttig te zijn.

Other episodes