Meilleur moyen de revenir à une révision SVN précédente d'un fichier?

167

J'ai accidentellement commis trop de fichiers dans un référentiel SVN et j'ai changé certaines choses que je ne voulais pas. (Soupir.) Afin de les ramener à leur état antérieur, le mieux que j'ai pu trouver était

svn rm l3toks.dtx
svn copy -r 854 svn+ssh://<repository URL>/l3toks.dtx ./l3toks.dtx

Jeez! N'y a-t-il pas de meilleur moyen? Pourquoi ne puis-je pas simplement écrire quelque chose comme ça:

svn revert -r 854 l3toks.dtx

D'accord, j'utilise uniquement la v1.4.4, mais j'ai parcouru la liste des modifications pour la branche 1.5 et je n'ai rien vu de directement lié à cela. Ai-je manqué quelque chose?


Edit: Je suppose que je n'étais pas assez clair. Je ne pense pas que je veux inverser la fusion, parce que je vais perdre les changements que je faisais veux faire! Dites cela fileAet fileBont tous deux été modifiés mais je voulais seulement m'engager fileA; taper accidentellement

svn commit -m "small change"

valide les deux fichiers, et maintenant je veux revenir en arrière fileB. La fusion inversée ne facilite pas cette tâche (pour autant que je sache) que les étapes décrites ci-dessus.

Will Robertson
la source
Copie possible de Comment annuler un commit SVN?
Vadzim

Réponses:

243
svn merge -r 854:853 l3toks.dtx

ou

svn merge -c -854 l3toks.dtx

Les deux commandes sont équivalentes .

orip
la source
5
Merci pour cela, je voulais juste dire quelque chose - disons, je suis à la révision 855, je veux retourner un fichier à la révision 854. Si je le fais svn merge -c -854 my.file, et puis le faire svn diff, il semble afficher une révision avant 854 (c'est-à-dire 853 ); seulement quand je le fais svm merge -c 854 myfile(sans le -), il semble que mon fichier est revenu à la rév 854. Merci encore, bravo!
sdaau
11
Y a-t-il une raison pour laquelle la première option ci-dessus a fonctionné comme un charme pour moi alors que la seconde n'a pas fonctionné DU TOUT?
skybondsor
7
N'oubliez pas de vous engager après la fusion inversée. J'oublie souvent :)
Vineeth Pradhan
11
Devrait vraiment moins 1 pour ne pas indiquer la différence entre ces deux commandes. Mauvaise réponse
Angry Dan
4
@sprog - s'il y a une différence, j'apprécierais de savoir
orip
34

Consultez la section « Annulation des modifications » du livre svn

luapyad
la source
5
Les liens vers des ressources externes sont encouragés, mais veuillez ajouter du contexte autour du lien afin que vos collègues utilisateurs aient une idée de ce que c'est et pourquoi il est là. Citez toujours la partie la plus pertinente d'un lien important, au cas où le site cible serait inaccessible ou serait définitivement hors ligne.
user2084795
32

désolé d'utiliser un peu d'espace sur juste une réitération de la réponse précédemment donnée - mais c'est quelque chose avec lequel je finis toujours par avoir des problèmes.

Disons que j'ai mis à jour les fichiers locaux avec la dernière révision, qui est 854. Ensuite, je voudrais obtenir une révision plus ancienne - la version du fichier de quelques révisions plus tôt, disons la révision 851.

La copie fonctionnerait:

svn copy -r 851 svn+ssh://<repository URL>/l3toks.dtx ./l3toks.dtx

.. cependant, je ne peux pas être dérangé de chercher l'URL du dépôt :)

La mise à jour pourrait apparemment fonctionner:

svn up -r 851 ./l3toks.dtx

... cependant, il marque également la copie locale comme "fraîchement extraite", ou plutôt "identique à la révision en ligne" (c'est-à-dire que dans Tortoise / RabbitVCS vous obtenez une coche verte OK) - ce qui signifie que vous ne pouvez pas faire svn ci -m "rolled back to r 851": simplement parce que le local subversionl'exécutable ne remarquera aucun changement local et ne sera pas dérangé de télécharger quoi que ce soit dans le référentiel en ligne.

Et, comme déjà répondu, la fusion inversée fonctionne - mais dans ce cas, il ne faut pas se fier à la syntaxe des raccourcis; mais déclarez spécifiquement:

svn merge -r HEAD:851 l3toks.dtx
--- Reverse-merging r854 through r852 into 'l3toks.dtx':
U    l3toks.dtx

Je dois admettre - je ne comprendrais jamais que la phrase " Fusion inversée de r854 à r852 dans un fichier " signifie " Je viens de recevoir r851 de votre fichier, et j'ai écrasé tout ce que vous aviez précédemment localement - et il est marqué comme différent de la dernière révision en ligne, donc vous pouvez le vérifier en ligne en tant que nouvelle révision " rollback" ", mais je suppose (et j'espère :)) que c'est ce qu'il fait :)

Après cela, on peut utiliser svn diffpour s'assurer rapidement que nous avons récupéré la bonne révision localement; et aussi, le fichier sera marqué d'un point d'exclamation rouge dans Tortoise / RabbitVCS (c'est-à-dire différent de la dernière version validée), et svn ci -m "rolled back to r 851"pourra donc s'exécuter cette fois.

Notez également que si, finalement, vous changez d'avis après la fusion inversée ( c'est-à-dire que vous voulez quand même continuer à travailler sur la dernière révision HEAD, ici 854 - après que vous êtes revenu à 851 localement, mais que vous n'avez pas encore validé la restauration. ), vous ne devriez pas utiliser svn up, car il dira simplement qu'il est déjà " A la révision 854 "; utiliser à la place svn revert --recursive .ou similaire ...

À votre santé!

Réf: Comment annuler les modifications à l'aide de Subversion - Jacob Wright - Flex, AIR, PHP, etc.

EDIT: ... et apparemment, exactement le même effet que svn merge -r HEAD:851 l3toks.dtx, peut être obtenu avec:

svn export -r 851 l3toks.dtx
A    l3toks.dtx
Export complete.
sdaau
la source
2
Vous devriez TOUJOURS préférer l'exportation svn, car elle fait exactement ce que vous voulez - extraire un fichier dans une certaine révision, tandis que la fusion inversée essaiera également de fusionner vos modifications locales avec la version spécifiée, c'est une opération complexe et folle, qui est sujettes aux erreurs si vous ne faites pas attention!
Falco
1
J'ai eu des problèmes avec la fusion inversée. Plutôt que de comprendre pourquoi, j'ai juste essayé l'exportation et cela a parfaitement fonctionné. Je recommande fortement d'utiliser simplement l'exportation. Vous pouvez utiliser --forcepour écraser les répertoires. N'oubliez pas qu'il écrasera toutes les modifications.
Nick
Très bonne explication sur ce qui se passe réellement! J'utilise fréquemment AnkhSVN et TortoiseSVN, et je ne vois nulle part où utiliser svn export- est-ce que je manque quelque chose ou est-ce que cela n'est tout simplement pas implémenté dans ces interfaces graphiques?
Conrad
@Conrad, Vous l'utilisez en cliquant sur "Exporter ..." dans AnkhSVN et "Exporter" dans TortoiseSVN à partir du menu contextuel de votre référentiel (clic droit)
nitinr708
10

J'ai récemment dû revenir à une révision particulière pour déboguer une ancienne version et cela a fonctionné comme par magie:

svn up -r 3340 (or what ever your desired revision number)

J'ai dû résoudre tous les conflits en utilisant l'option "tc" car je ne me souciais pas des changements locaux (vérifié tout ce qui m'intéressait avant de revenir)

Revenir à la révision principale était aussi simple:

svn up
Igor
la source
5

Ce que vous recherchez s'appelle une "fusion inversée". Vous devriez consulter la documentation concernant la fonction de fusion dans le livre SVN (comme luapyad, ou plus précisément le premier commentateur de ce post, le souligne). Si vous utilisez Tortoise, vous pouvez également simplement aller dans la vue du journal et cliquer avec le bouton droit de la souris et choisir «annuler les modifications de cette révision» sur celle où vous avez commis l'erreur.

rmeador
la source
4

La fusion inversée est exactement ce que vous voulez (voir la réponse de luapyad). Appliquez simplement la fusion au fichier commis par erreur au lieu de tout le répertoire.

À M
la source
4

Si vous souhaitez uniquement annuler la dernière consignation, vous pouvez utiliser les éléments suivants

svn merge -r head:prev l3toks.dtx

De cette façon, vous n'avez pas à rechercher les numéros de version actuelle et précédente.

Ken Russell
la source
4

svn merge fusionnera les révisions, ne les annulera pas. c'est-à-dire que si vous avez un ajout dans votre version HEAD, fusionnez-le avec une révision précédente, le changement persistera.

J'utilise svn cat puis je le redirige dans le fichier:

svn cat -r 851 l3toks.dtx > l3toks.dtx

Ensuite, vous avez le contenu 851 dans ce fichier et vous pouvez le réintégrer.

Dylan
la source
3

Si vous utilisez l' IDE Eclipse avec le plugin SVN, vous pouvez procéder comme suit:

  1. Cliquez avec le bouton droit sur les fichiers que vous souhaitez restaurer (ou le dossier dans lequel ils étaient contenus, si vous les avez supprimés par erreur et que vous souhaitez les rajouter)
  2. Sélectionnez " Équipe> Changer "
  3. Cliquez sur le bouton radion "Révision" et entrez le numéro de révision auquel vous souhaitez revenir. Cliquez sur OK
  4. Accédez à la perspective Synchroniser
  5. Sélectionnez tous les fichiers que vous souhaitez restaurer
  6. Faites un clic droit sur la sélection et faites " Remplacer et valider ... "

Cela rétablira les fichiers à la révision souhaitée. Gardez simplement à l'esprit que SVN verra les changements comme un nouveau commit. Autrement dit, la modification reçoit un nouveau numéro de révision et il n'y a aucun lien entre l'ancienne révision et la nouvelle. Vous devez spécifier dans les commentaires de validation que vous rétablissez ces fichiers vers une révision spécifique.

ceiroa
la source