Comment puis-je revenir à une version plus ancienne de notre code dans Subversion?

je travaille sur un projet avec un ami et je veux revenir à une ancienne version de notre code et de le régler à l'actuel. Comment dois-je faire?

j'utilise "anksvn" sur vs08.

j'ai la version que je veux sur mon PC, mais le commit échoue; le message que je reçois est "commit est un échec, fichier ou répertoire est périmé."

j'ai aussi le client subversion sur mon PC.

445
demandé sur Chen Kinnrot 2009-05-02 12:35:42

13 réponses

fondamentalement, vous avez besoin de" fusionner en arrière "- appliquer une différence entre la version actuelle et la version précédente à la version actuelle (de sorte que vous finissez avec une copie de travail ressemblant à l'ancienne version) et puis de commettre à 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 contient une bonne section À propos de cette .

715
répondu Jon Skeet 2015-05-08 11:54:40

la raison pour laquelle vous ne pouvez rien faire directement avec la bonne copie que vous avez sur votre PC, est que son .les dossiers svn savent qu'il s'agit d'un code du passé, il nécessite donc une mise à jour. Mais vous ne pouvez réellement propager des changements qu'en tête de l'histoire de subversion.

vous pouvez utiliser

svn update -r <earlier_revision_number>

pour vérifier les anciennes versions de votre projet, jusqu'à trouver le bon numéro de révision, de votre bonne version. Lorsque vous avez Je l'ai trouvé, j'ai mis à jour la dernière révision (head), puis j'ai appliqué la fusion svn comme suggéré ci-dessus.

si vous ne pouvez vraiment pas le trouver, et besoin pour propager la copie sur votre PC, puis obtenir une nouvelle mise à jour à la dernière version, et copier votre" bonne "version sur le dessus de celui-ci ( sans le .svn dossiers!). Supprimez tous les fichiers qui n'étaient pas dans la bonne copie des dossiers et de subversion, et propagez ce que vous avez maintenant.

168
répondu joeytwiddle 2009-05-02 09:43:51

il suffit d'utiliser cette ligne

svn update-r yourOldRevesion

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

svn info

33
répondu M.Othman 2017-12-12 20:03:24

la façon standard d'utiliser merge pour annuler l'enregistrement entier fonctionne très bien, si c'est ce que vous voulez faire. Parfois, cependant, tout ce que vous voulez faire est de retourner un seul fichier. Il n'y a aucun moyen légitime de le faire, mais il y a un piratage:

  1. trouvez la version que vous voulez en utilisant svn log.
  2. utiliser la sous-commande export DE svn:

    svn export http://url-to-your-file@123 /tmp/nom de fichier

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

26
répondu Bill 2009-07-02 20:39:44

un peu plus old-school

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

puis l'habituel

svn diff
svn commit
8
répondu Yauhen Yakimovich 2013-09-02 10:53:15

je pense que c'est plus adapté:

faire la fusion en arrière, par exemple, si le code engagé contient la révision de Rév 5612 à 5616, fusionnez-le à l'envers. Il fonctionne dans ma fin.

par exemple:

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

Il contiendrait une fusion de code à l'ancienne révision, alors vous pourriez commettre.

5
répondu hpal 2016-06-20 16:00:33

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

je veux annuler les changements dans les commits multiples que j'ai fait pour certaines fois et je veux aller au point de commit précédent.

  1. Aller à l'Équipe -> Afficher l'Historique.
  2. cliquez avec le bouton droit de la souris sur la plage ou des révisions que vous voulez ignorer.
  3. sélectionnez l'option" revenir en arrière".

ceci lancera une fusion inversée, défaisant les changements dans votre copie de travail.

il suffit de réviser le code et de s'engager.

3
répondu Ziya 2014-02-28 20:08:13

faites un clic droit sur la plus haute hiérarchie que vous voulez inverser > > Revert ou Revert to Revision

2
répondu Yuval Adam 2009-05-02 08:40:04

clic droit sur le projet > remplacer par > révision ou URL > sélectionnez la révision spécifique que vous souhaitez inverser.

envoie maintenant la version locale du code de mise à jour au dépôt. Cela ramènera la base de code à la révision spécifique.

1
répondu KayV 2016-09-06 13:11:08

la plupart des réponses précédentes utilisaient une fusion inversée, et c'est habituellement 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 fin de ligne DOS lors d'un petit changement, et je l'ai engagé. Ceci est facilement défait, soit en changeant les fins de ligne et en commettant à nouveau, soit par une fusion inversée, mais cela a pour effet de faire svn blame liste mon édition comme la source de chaque ligne du fichier. (Fait intéressant, TortoiseSVN sur Windows n'est pas affecté par cela; seulement la ligne de commande svn blame .)

si vous voulez maintenir l'histoire comme rapporté par svn blame , je pense que vous devez faire ce qui suit:

  • supprimer le fichier et commit.
  • dans le dépôt, copiez la bonne copie précédente du fichier dans la tête, et propagez.
  • Restaurer les modifications que vous voulez garder.

la suppression est un peu effrayante, mais rappelez-vous que vous avez toujours le fichier sauvegardé dans le dépôt, donc sa restauration n'est pas une grosse affaire. Voici un code pour illustrer les étapes. Supposons que xxx est le numéro de révision de la dernière bonne copie.

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, pas un nom de fichier.

1
répondu user2554330 2017-05-24 12:48:18

synchronisez avec l'ancienne version et propagez-la. Ceci devrait faire l'affaire.

voici aussi une explication des changements défaisants.

0
répondu Mork0075 2015-05-08 11:55:49

la réponse de Jon Skeet est à peu près la solution en un mot, mais si vous êtes comme moi, vous pourriez vouloir une explication. Le manuel Subversion appelle cela un

Cherry-Pick Merge

des pages de manuel.

  1. cette forme est appelée une fusion "cherry-pick": '- r N: M ' se réfère à la différence dans l'histoire de la source branche entre les révisions N et M.

    une "plage inversée" peut être utilisée pour annuler des changements. Par exemple, lorsque source et cible se rapportent à la même direction générale, une la révision peut être "annulé'. Dans un plage inversée , N est supérieur à M '- r N:M', ou l'option '- c' est utilisée avec un nombre négatif: '- c-M' est équivalent à '-r M:'. Des changements comme celui-ci sont aussi connus comme effectuer une "fusion inversée".


  • si la source est un fichier, alors des différences sont appliquées à ce fichier (utile pour la rétroconcentration des modifications antérieures). Autrement, si la source est un répertoire, puis la cible par défaut '.'.

    selon l'usage, la copie de travail doivent être à jour, à une seule révision, sans modifications locales et sans sous-zones commutées.

Exemple:

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

cela remplacera la copie locale[2983] (qui, selon la citation ci-dessus, devrait être synchronisée avec le serveur--votre responsabilité) par la révision 289 du serveur. Le changement se produit localement, ce qui signifie que si vous avez une caisse propre, alors les changements peuvent être inspectés avant de les commettre.

0
répondu Jonathan Komar 2018-05-23 11:16:20

ce qui suit a fonctionné pour moi.

j'ai eu beaucoup de changements locaux et j'ai dû jeter ceux de la copie locale et vérifier la dernière version stable dans SVN.

  1. Vérifiez l'état de tous les fichiers, y compris les fichiers ignorés.

  2. Grep toutes les lignes pour obtenir les fichiers nouvellement ajoutés et ignorés.

  3. remplacer ceux avec // .

  4. et rm-rf toutes les lignes.

    svn status --no-ignorer | grep '^[?I]' / sed " s / ^[?I] | / "/ xargs-I{} rm-rf "{}

-1
répondu shah1988 2017-12-12 20:28:19