web-dev-qa-db-fra.com

Meilleure façon de revenir à une révision SVN précédente d'un fichier?

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

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

Bon Dieu! N'y a-t-il pas de meilleur moyen? Pourquoi ne puis-je pas écrire quelque chose comme ceci:

svn revert -r 854 l3toks.dtx

D'accord, je n'utilise que la v1.4.4, mais j'ai survolé la liste des modifications pour la branche 1.5 et je ne pouvais rien voir directement lié à cela. Est-ce que j'ai manqué quelque chose?


Edit: Je suppose que je n'ai pas été assez clair. Je ne pense pas que je veuille inverser la fusion, car je perdrai les modifications que je ai veux apporter! Dites que fileA et fileB ont tous deux été modifiés, mais je voulais uniquement valider fileA; taper accidentellement

svn commit -m "small change"

valide les deux fichiers et je veux maintenant restaurer fileB. La fusion inverse rend cette tâche pas plus facile (autant que je peux dire) que les étapes que j'ai décrites ci-dessus.

167
Will Robertson
svn merge -r 854:853 l3toks.dtx

ou

svn merge -c -854 l3toks.dtx

Les deux commandes sont équivalentes .

243
orip

Consultez la section " annulation des modifications " de la section svn book

35
luapyad

désolé d’avoir utilisé un peu d’espace en répétant la réponse donnée précédemment - mais c’est quelque chose qui me pose toujours problème.

Supposons que j'ai mis à jour les fichiers locaux avec la dernière révision, la 854. Ensuite, j'aimerais 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é par la recherche d’URL de dépôt :)

Mettre à jour semble fonctionner:

svn up -r 851 ./l3toks.dtx

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

Et, comme déjà répondu, la fusion inverse fonctionne - mais dans ce cas, il ne faut pas compter sur la syntaxe de raccourci; mais précisez:

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

Je dois admettre que je ne comprendrais jamais la phrase " inverser la fusion de r854 à r852 dans un fichier " pour signifier " Vous venez d’obtenir le r851 de votre fichier et d’écraser ce que vous aviez précédemment localement - et il est marqué comme différent de la dernière révision en ligne. Vous pouvez donc le vérifier en ligne en tant que nouvelle révision d’annulation . ", mais je suppose (et j'espère :)) c'est ce que ça fait :)

Après cela, vous pouvez utiliser svn diff pour vérifier rapidement si nous obtenons 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 ainsi svn ci -m "rolled back to r 851" pourra être exécuté cette fois.

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

À votre santé!

Réf.: Comment annuler des modifications avec Subversion - Jacob Wright - Flex, AIR, PHP, etc.

EDIT: ... et apparemment, 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.
32
sdaau

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

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

Je devais résoudre tous les conflits en utilisant l'option "tc" car je ne me souciais pas des changements locaux (je vérifiais tout ce qui m'importait avant de revenir en arrière)

Pour revenir à la tête de révision était aussi simple:

svn up
10
Igor

Ce que vous recherchez s'appelle une "fusion inverse". Vous devriez consulter la documentation concernant la fonction de fusion dans le livre SVN (comme le fait remarquer luapyad, ou plus précisément le premier commentateur de cet article). Si vous utilisez Tortoise, vous pouvez également accéder à la vue Journal, 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.

5
rmeador

Si vous voulez seulement annuler la dernière connexion, vous pouvez utiliser le code suivant

svn merge -r head:prev l3toks.dtx

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

4
Ken Russell

svn merge fusionnera les révisions, pas les annuler. c'est-à-dire que si vous avez des ajouts dans votre version HEAD puis fusionnez-les avec une révision précédente, les modifications seront conservées.

J'utilise svn cat puis le redirige vers 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.

4
Dylan

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

4
Tom

Si vous utilisez le Eclipse IDE avec le plug-in SVN, vous pouvez procéder comme suit:

  1. Cliquez avec le bouton droit sur les fichiers que vous souhaitez restaurer (ou sur le dossier dans lequel ils étaient contenus, si vous les avez supprimés par erreur et que vous souhaitez les rajouter).
  2. Sélectionnez "Team> Switch"
  3. Choisissez le bouton "Révision" radion et entrez le numéro de révision sur lequel vous souhaitez revenir. Cliquez sur OK
  4. Aller à 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 modifications comme un nouveau commit. C'est-à-dire que la modification obtient un nouveau numéro de révision et qu'il n'y a pas de lien entre l'ancienne révision et la nouvelle. Vous devez spécifier dans les commentaires de validation que vous restaurez ces fichiers vers une révision spécifique.

3
ceiroa