Comment annuler un commit SVN?

303

J'ai trouvé divers exemples de comment annuler un commit SVN comme

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

ou

svn merge -c -[R] .

Mais aucun d'eux 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 puis-je vérifier que la restauration a été effectuée (sans regarder dans le fichier réel les modifications ont été annulées)?

Alex
la source
16
N'avez-vous jamais accepté de réponse parce qu'aucun d'entre eux n'a fonctionné?
2rs2ts
4
Si vous voulez une réponse littérale, utilisez "svn merge -c -1944". Pour vérifier si cela a fonctionné: "svn diff"
John Sampson
Et si c'était le cas, j'ai 1943 (bon engagement), puis 1944 (mauvais engagement), puis 1945 (bon engagement), puis 1946 (bon engagement). Maintenant, je veux supprimer seulement 1944 (mauvaise validation) et conserver toutes les révisions après 1944, cela signifie que je veux un résultat comme 1943,1945,1946 (supprimer uniquement 1944) de toutes ces révisions, que dois-je faire ??
Bhavin_m

Réponses:

448

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 cela doit être fait après chaque fusion) vous validerez les résultats

Voulez-vous voir les journaux?

Blaireau paresseux
la source
9
@dwjohnston - oui, les fusions sont toujours effectuées dans WC et ce n'est pas une tâche côté serveur
Lazy Badger
14
svn: Merge source required. Pas de dé.
2rs2ts
27
@ 2rs2ts semble que vous ayez oublié le point de fin pour désigner «faites ceci dans le répertoire courant».
Dalin
14
vous pouvez également faire plusieurs svn merge -c -42587,-42589 .
validations
1
@ahnbizcad - révision (unique), que vous souhaitez annuler
Lazy Badger
130

Si vous utilisez le client TortoiseSVN , cela se fait facilement via la boîte de dialogue Afficher le journal .

dodgy_coder
la source
5
C'est de loin la façon la plus simple de le faire
Markku K.
5
C'est obsolète. Il n'y a plus de menu contextuel disponible pour le client dans la version actuelle.
user1789573
19
Quoi? TortoiseSVN EST un menu contextuel, plus les dialogues qu'il engendre. Qu'entendez-vous par «il n'y a plus de menu contextuel»? Il y en a très certainement!
Ben
@Ben Je pense que user1789573 était un peu gêné par la mention explicite de "Menu contextuel" dans le tutoriel lié à la réponse.
Tom Catullo
2
Au cas où vous le verriez plus tard, il est (toujours) là. Dans l'écran d'affichage du journal, cliquez avec le bouton droit sur la révision et il y a une option "Revenir à cette révision". C'est dans TortoiseSVN 1.9.4 Build 27285. Je viens de l'utiliser et je peux vous dire que cela fonctionne très bien.
Bruce Van Horn
65

svn merge -r 1944:1943 .devrait annuler les modifications de r1944 dans votre copie de travail. Vous pouvez ensuite examiner les modifications dans votre copie de travail (avec diff), mais vous devez vous engager pour appliquer la restauration dans le référentiel.

onon15
la source
4
Ne fonctionne pas, nécessite une source de fusion. Essayé à la svn merge -r 1944:1943 .place, mais rien n'a changé.
Alex
Le référentiel a-t-il avancé depuis r1944? Si oui, y a-t-il des changements contradictoires sur les mêmes lignes que les changements entre r1943 et r1944?
onon15
J'en suis à la révision 1945 et il ne semble pas y avoir de conflit. Ni svn statusne svn diffdonne rien.
Alex
7
Erreur:svn: Try 'svn help' for more info svn: Merge source required
Alex
5
Mais svn merge -r 1945:1943 .semblent avoir fonctionné. Je pense que je comprends: vous devez fusionner la version d'avant le «mauvais» commit dans votre dépôt de travail. C'est ok quand vous voulez faire un simple «retour» du commit précédent. Mais que faire si vous souhaitez annuler les modifications apportées à la version 1900?
Alex
45

Tout d'abord, rétablissez la copie de travail à 1943.

> svn merge -c -1943 .

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

> svn status

Troisièmement, validez 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.
------------------------------------------------------------------------
Shaun Luttin
la source
1
Et si c'était le cas, j'ai 1943 (bon engagement), puis 1944 (mauvais engagement), puis 1945 (bon engagement), puis 1946 (bon engagement). Maintenant, je veux supprimer seulement 1944 (mauvaise validation) et conserver toutes les révisions après 1944, cela signifie que je veux un résultat comme 1943,1945,1946 (supprimer uniquement 1944) de toutes ces révisions, que dois-je faire ??
Bhavin_m
26

Il est impossible de "annuler" 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 efficacement les modifications.

Jakub Zaverka
la source
18
Juste pour être extrêmement précis, je dirais que si vous avez un accès administrateur au référentiel, vous pouvez "annuler l'engagement". Ceci en créant un référentiel de clone jusqu'à une révision donnée en utilisant svn dumppuis svn load. Mais, bien sûr, cela ne devrait pas être utilisé dans des circonstances normales.
le15 nov.11-12
4
Je ne veux pas annuler l'engagement, je veux créer un nouveau numéro de commit avec un certain commit inversé. Les décors disent que j'ai extrait la version 1944, que j'ai fait un commit en 1945, que je veux «revenir». Ensuite, je veux avoir une version 1946, dont les fichiers sont identiques à ceux de la version 1944. (Sauf l'histoire bien sûr.) Mais la question demeure: comment faire? Quelles sont les commandes?
Alex
//, @Alex, cela m'intéresse aussi, surtout pour quelque chose d'analogue à $ git revert. J'ai trouvé un peu difficile d'apprendre SVN après avoir utilisé Git pendant si longtemps.
Nathan Basanese
10

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

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

Si la marche à sec semble bonne, exécutez la commande sans --dry-run

Vérifiez le changement de révision et réengagez. Pour rechercher des numéros de version, essayez:

svn log
BentheFolker
la source
4
F=code.c
REV=123
svn diff -c $REV $F | patch -R -p0 \
    && svn commit -m "undid rev $REV" $F
jmullee
la source
Cela nécessite-t-il que la copie locale soit différente de la mauvaise révision?
Eliezer Miron du
2

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

Nikita
la source
2

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 rev 1443qui se mettent à jour vers rev 1445, synchronisent toujours tous les fichiers modifiés 1444même s'ils sont identiques à ceux 1443de la fusion. J'avais besoin que les utilisateurs finaux ne voient pas du tout la mise à jour.

Si vous souhaitez masquer complètement la validation, il est possible de créer une nouvelle branche à la révision correcte, puis de permuter les branches. La seule chose est que vous devez supprimer et 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 là-bas =)

droxxodia
la source
2
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 pas non plus l'ancien code. Après avoir exécuté la commande ci-dessus, j'ai obtenu un ancien code de version propre.

amit ghosh
la source
1

J'ai essayé ce qui précède, ( svn merge) et tu as raison, ça fait jack. toutefois

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

semble fonctionner, mais n'est pas permanent (mon svn montre simplement une ancienne révision). J'ai donc dû

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

Dans mon cas particulier, mon objectif est interfaces/AngelInterface.php. J'ai apporté des modifications au fichier, les ai validées, j'ai mis à jour l'ordinateur de construction, j'ai exécuté le compilateur phpdoc et j'ai constaté que mes modifications étaient une perte de temps. svn log interfaces/AngelInterface.phpmontre ma modification en tant que r22060 et la validation précédente sur ce fichier était r22059. Je peux donc svn update -r 22059 interfaces/AngelInterface.phpet je me retrouve avec du code tel qu'il était à nouveau en -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.phpdans tout ce qui précède.

sibaz
la source
1
Une autre chose, comme cela a déjà été dit, ce que vous ne pouvez pas faire est de supprimer le commit de l'historique, comme vous pouvez le faire dans git en piratant directement les refs. Tout ce que vous pouvez faire, c'est d'utiliser le référentiel pour modifier votre source selon la façon dont vous le souhaitez, et le valider en tant que changement.
sibaz
Après avoir approfondi mes recherches, je peux voir qu'il est possible de supprimer le commit de l'historique en utilisant svnadmin, mais il est fortement déconseillé. Voir stackoverflow.com/questions/5566327/…
sibaz
0

Si vous souhaitez supprimer complètement les validations de l'historique, vous pouvez également effectuer un vidage du dépôt à une révision spécifique, puis importer ce vidage. Plus précisément:

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

La commande svnrdump remplit la même fonction que le vidage svnadmin mais fonctionne sur un dépôt distant.

Ensuite, importez simplement le fichier de vidage dans le référentiel de votre choix. Cela a été testé pour bien fonctionner sur Beanstalk.

redcalfee
la source