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 1443
die updaten naar rev 1445
nog steeds alle bestanden die zijn gewijzigd in 1444
, ook al zijn ze gelijk aan 1443
uit 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.php
toont mijn wijziging als r22060 en de vorige commit in dat bestand was r22059. Dus ik kan svn update -r 22059 interfaces/AngelInterface.php
en 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 . -R
in plaats van interfaces/AngelInterface.php
in 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 merge
commando 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 /repo
is. Maar het kan /home/svn/myrepo
zijn 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 svn
heet, 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 100
is en dat uw juiste versie 99
is:
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.