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)?
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?
Si vous utilisez le client TortoiseSVN , vous pouvez le faire facilement via la boîte de dialogue Afficher le journal .
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.
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.
------------------------------------------------------------------------
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.
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
F=code.c
REV=123
svn diff -c $REV $F | patch -R -p0 \
&& svn commit -m "undid rev $REV" $F
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 =)
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.
Alex, essayez ceci: svn merge [WorkingFolderPath] -r 1944: 1943
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.
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.