web-dev-qa-db-fra.com

Comment revenir à une ancienne version de notre code dans Subversion?

Je travaille sur un projet avec un ami et je souhaite revenir à une ancienne version de notre code et la définir comme étant la version actuelle. Comment fait-on ça?

J'utilise "anksvn" sur vs08.

J'ai la version que je veux sur mon PC, mais la validation échoue; Le message que je reçois est "La validation a échoué, le fichier ou le répertoire est obsolète".

J'ai aussi le client Subversion sur mon PC.

467
Chen Kinnrot

Fondamentalement, vous devez "fusionner en arrière" - appliquer un diff entre la version actuelle et la version précédente à la version actuelle (vous obtenez donc une copie de travail comme l’ancienne version), puis à nouveau. Ainsi, par exemple, pour passer de la révision 150 (actuelle) à la révision 140:

svn update
svn merge -r 150:140 .
svn commit -m "Rolled back to r140"

Le livre rouge de Subversion a un bonne section à ce sujet .

754
Jon Skeet

Vous ne pouvez valider de nouvelles modifications qu’à la tête de l’historique de Subversion.

La raison pour laquelle vous ne pouvez rien faire directement avec la bonne copie que vous avez sur votre PC, est que ses dossiers .svn savent qu'il s'agit d'un code du passé, ce qui nécessite une mise à jour avant toute validation.

Trouver le bon numéro de révision et revenir

  1. Recherchez le numéro de révision de l’ancienne copie souhaitée.

    Obtenez votre révision actuelle avec:

    svn info --show-item revision
    # or
    svn log
    

    Ou pour vérifier les anciennes versions de votre projet, utilisez:

    svn update -r <earlier_revision_number>
    

    jusqu'à ce que vous trouviez le bon numéro de révision.

  2. Notez le bon numéro de révision (en supposant que 123 pour les exemples ci-dessous).

  3. Mise à jour à la dernière révision:

    svn update
    
  4. Annulez toutes les modifications entre la révision souhaitée et la dernière version:

    svn merge -r HEAD:123 .
    svn commit "Reverted to revision 123"
    

    (identique à la réponse de Jon Skeet ci-dessus.)

Si vous ne trouvez pas le numéro de révision

Si vous ne trouvez pas l'ancienne copie et que vous voulez simplement valider les fichiers actuellement sur votre PC:

  1. Faites une copie de votre bonne version (mais sans aucun dossier .svn):

    cd ..
    rsync -ai --exclude=.svn  project/  project-good/
    
  2. Maintenant, assurez-vous d'avoir la dernière version:

    cd project
    svn update
    # or make a fresh checkout
    svn checkout <url>
    
  3. Copiez votre bonne version par-dessus la copie de travail.

    Cette commande copiera et supprimera également tous les fichiers de l’arborescence de travail qui ne se trouvent pas dans votre copie conforme, mais elle n’affectera pas les dossiers .svn existants.

    cd ..
    rsync -ai --exclude=.svn --delete  project-good/  project/
    

    Si vous n'avez pas rsync, vous pouvez utiliser cp -a mais vous devrez également supprimer manuellement tous les fichiers indésirables.

  4. Vous devriez pouvoir commettre ce que vous avez maintenant.

    cd project
    svn commit "Reverted to good copy"
    
169
joeytwiddle

Il suffit d'utiliser cette ligne

svn update -r yourOldRevesion

Vous pouvez connaître votre révision actuelle en utilisant:

svn info

35
M.Othman

La méthode standard d’utilisation de la fusion pour annuler l’enregistrement complet fonctionne très bien, si c’est ce que vous voulez faire. Parfois, cependant, tout ce que vous voulez faire est de restaurer un seul fichier. Il n'y a pas de moyen légitime de le faire, mais il y a un bidouillage:

  1. Trouvez la version que vous voulez en utilisant svn log.
  2. Utilisez la sous-commande export de svn:

    svn export http: // url-dans-votre-fichier @ 12 /tmp/nom_fichier

(Où 123 est le numéro de révision d'une bonne version du fichier.) Ensuite, déplacez ou copiez ce fichier unique pour écraser l'ancien. Archivez le fichier modifié et vous avez terminé.

27
Bill

n peu plus old school

svn diff -r 150:140 > ../r140.patch
patch -p0 < ../r140.patch

alors l'habitude

svn diff
svn commit
8
Yauhen Yakimovich

Je pense que cela convient le mieux:

Faites la fusion en arrière, par exemple, si le code validé contient la révision de la révision 5612 à la version 5616, fusionnez-la simplement en arrière. Cela fonctionne de mon côté.

Par exemple:

svn merge -r 5616:5612 https://<your_svn_repository>/

Il contiendrait un code fusionné à la révision précédente, alors vous pourriez le commettre.

5
hpal

C'est ce que j'ai fait et travaillé pour moi.

Je souhaite annuler les modifications de plusieurs commits que j'ai effectuées à certains moments et je souhaite revenir au point de validation précédent.

  1. Aller à l'équipe -> Afficher l'historique.
  2. Cliquez avec le bouton droit sur la ou les plages de révisions que vous souhaitez ignorer.
  3. Sélectionnez l'option "Annuler les modifications".

Cela fera une fusion inversée, annulant les modifications dans votre copie de travail.

Il suffit de revoir le code et de s’engager.

3
Ziya

Cliquez avec le bouton droit sur la hiérarchie supérieure que vous souhaitez rétablir >> Revert ou Revert to Revision

2
Yuval Adam

Cliquez avec le bouton droit sur le projet> Remplacer par> Révision ou URL> Sélectionnez la révision spécifique que vous souhaitez annuler.

Maintenant, validez la version du code de mise à jour locale dans le référentiel. Cela va retourner la base de code à la révision spécifique.

1
KayV

La plupart des réponses précédentes utilisaient une fusion inversée, et c'est généralement la bonne réponse. Cependant, il y a une situation (qui vient de m'arriver) où ce n'est pas le cas.

J'ai accidentellement changé un fichier avec des fins de ligne Unix en fins de ligne DOS lors d'une modification minime et je l'ai validé. Ceci est facilement annulé, soit en changeant les fins de ligne et en validant à nouveau, soit par une fusion inversée, mais cela a pour effet de faire svn blame lister mon édition comme source de chaque ligne du fichier. (Fait intéressant, TortoiseSVN sous Windows n’est pas affecté par ceci; seule la ligne de commande svn blame.)

Si vous souhaitez conserver l'historique tel que rapporté par svn blame, je pense que vous devez procéder comme suit:

  • Supprimez le fichier et validez.
  • Dans le référentiel, copiez l'ancienne copie conforme du fichier dans l'en-tête et validez.
  • Restaurez les modifications que vous souhaitez conserver.

La suppression est un peu effrayante, mais souvenez-vous que le fichier est toujours enregistré dans le référentiel, sa restauration n’est donc pas une mince affaire. Voici du code pour illustrer les étapes. Supposons que xxx soit le numéro de révision de la dernière copie conforme.

svn rm svn+ssh://path/to/file
svn copy svn+ssh://path/to/file@xxx svn+ssh://path/to -m"Restore good copy"
svn update
<restore the edits>
svn commit -m"Restore edits"

Notez que pour une copie dans le référentiel, la destination doit être un répertoire et non un nom de fichier.

1
user2554330

Il y a beaucoup de réponses dangereuses sur cette page. Notez que depuis la version 1.6 de SVN, la mise à jour -r peut provoquer des conflits d’arbres, qui se transforment rapidement en cauchemar kafkeresque potentiellement gênant pour la perte de données, dans lequel vous recherchez des informations sur les conflits d’arbres.

La manière correcte de revenir à une version est la suivante:

svn merge -r HEAD:12345 .

Où 12345 est le numéro de version. N'oublie pas le point.

0
Owl

La réponse de Jon Skeet est à peu près la solution, mais si vous êtes comme moi, vous voudrez peut-être une explication. Le manuel Subversion appelle cela une

Merry-Pick Merge

À partir des pages de manuel.

  1. Cette forme s'appelle une fusion 'choix de recherche': '-r N: M' fait référence à la différence dans l'historique de la branche source entre les révisions N et M.

    Une "plage inverse" peut être utilisée pour annuler les modifications. Par exemple, lorsque la source et la cible font référence à la même branche, une révision précédemment validée peut être "annulée". Dans un plage inverse, N est supérieur à M dans '-r N: M', ou l'option '-c' est utilisée avec un nombre négatif: '-c -M' est équivalent à ' -r M: '. L'annulation de telles modifications est également connue sous le nom de "fusion inverse".


  • Si la source est un fichier, des différences lui sont appliquées (utile pour la fusion inverse des modifications antérieures). Sinon, si la source est un répertoire, la cible par défaut est '.'.

    En utilisation normale, la copie de travail doit être à jour, lors d’une révision unique, sans modification locale ni sous-arbre commuté.

Exemple:

svn merge -r 2983:289 path/to/file

Ceci remplacera la copie locale [2983] (qui, selon la citation ci-dessus, devrait être synchronisée avec le serveur - votre responsabilité) avec la révision 289 du serveur. La modification est effectuée localement, ce qui signifie que si vous avez une commande propre, vous pouvez alors vérifier les modifications avant de les valider.

0
Jonathan Komar

Synchronisez avec l'ancienne version et validez-la. Cela devrait faire l'affaire.

Voici également une explication de l'annulation des modifications.

0
Mork0075