web-dev-qa-db-fra.com

Comment annuler un commit SVN?

J'ai trouvé divers exemples sur la façon de rétablir un commit SVN comme

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

ou

svn merge -c -[R] .

Mais ni l'un ni l'autre ne semble fonctionner. J'ai essayé ces commandes et vérifié les fichiers qui ont été modifiés à la main.

Comment annuler un commit avec le numéro de révision 1944? Comment est-ce que je vérifie que la restauration a été effectuée (sans regarder dans le fichier réel les modifications ont été annulées)?

289
Alex

Les deux exemples doivent fonctionner, mais

svn merge -r UPREV:LOWREV . annuler la plage

svn merge -c -REV . annuler une seule révision

dans cette syntaxe - si le répertoire actuel est WC et (comme dans chaque opération de fusion), les résultats seront validés

Voulez-vous voir les journaux?

429
Lazy Badger

Si vous utilisez le client TortoiseSVN , vous pouvez le faire facilement via la boîte de dialogue Afficher le journal .

127
dodgy_coder

svn merge -r 1944:1943 . devrait annuler les modifications de r1944 dans votre copie de travail. Vous pouvez ensuite passer en revue les modifications dans votre copie de travail (avec diff), mais vous devrez valider pour appliquer le retour dans le référentiel.

59
onon15

Tout d’abord, rétablissez la copie de travail en 1943.

> svn merge -c -1943 .

Deuxièmement, vérifiez ce qui va être engagé.

> svn status

Troisièmement, commettez la version 1945.

> svn commit -m "Fix bad commit."

Quatrièmement, regardez le nouveau journal.

> 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

Il est impossible de "dégager" une révision, mais vous pouvez rétablir votre copie de travail en version 1943 et la valider en tant que version 1945. Les versions 1943 et 1945 seront identiques, annulant ainsi les modifications.

26
Jakub Zaverka

Ce qui suit fera un essai, comme il est dit. HEAD étant la version actuelle, PREV est précédent, puis le chemin d'accès à votre fichier ou à l'élément validé:

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

Si le fonctionnement à sec semble bon, exécutez la commande sans --dry-run

Vérifiez la modification dans la révision et réengagez. Pour rechercher les numéros de version, essayez:

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

Bien que les suggestions déjà données puissent fonctionner pour certaines personnes, cela ne fonctionne pas pour mon cas. Lors de la fusion, les utilisateurs de rev 1443 qui mettent à jour vers rev 1445 synchronisent encore tous les fichiers modifiés dans 1444 même s’ils sont égaux à 1443 depuis la fusion. J'avais besoin d'utilisateurs finaux pour ne pas voir la mise à jour du tout.

Si vous souhaitez masquer complètement la validation, il est possible de créer une nouvelle branche avec la révision correcte, puis d’échanger les branches. La seule chose à faire est de supprimer et de rajouter tous les verrous.

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>

Cela a fonctionné pour moi, peut-être que cela sera utile à quelqu'un d'autre =)

2
droxxodia
svn merge -c -M PATH

Cela m'a sauvé la vie.

J'avais le même problème, après être revenu, je ne voyais plus l'ancien code. Après avoir exécuté la commande ci-dessus, j'ai obtenu un ancien code de version propre.

2
amit ghosh

Alex, essayez ceci: svn merge [WorkingFolderPath] -r 1944: 1943

2
Nikita

J'ai essayé ce qui précède, (svn merge) et vous avez raison, il est jack. pourtant

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

semble fonctionner, mais n'est pas permanent (mon svn montre simplement une ancienne révision). Donc je devais

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

Dans mon cas particulier, ma cible est interfaces/AngelInterface.php. J'ai apporté des modifications au fichier, je les ai validées, j'ai mis à jour l'ordinateur de compilation qui exécutait le compilateur phpdoc et constaté que mes modifications étaient une perte de temps. svn log interfaces/AngelInterface.php indique ma modification sous la référence r22060 et la validation précédente de ce fichier était la r22059. Donc, je peux svn update -r 22059 interfaces/AngelInterface.php et je me retrouve avec le code tel qu'il était dans -r22059. Ensuite :-

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

Alternativement, je pourrais faire la même chose sur un répertoire, en spécifiant . -R à la place de interfaces/AngelInterface.php dans tout ce qui précède.

1
sibaz

Si vous souhaitez supprimer complètement les validations de l'historique, vous pouvez également effectuer une sauvegarde du référentiel lors d'une révision spécifique, puis importer cette sauvegarde. Plus précisément:

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

La commande svnrdump remplit la même fonction que svnadmin dump mais fonctionne sur un référentiel distant.

Ensuite, importez le fichier de vidage dans votre dépôt de choix. Cela a été testé pour bien fonctionner sur Beanstalk.

0
redcalfee