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.
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 .
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.
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.
Notez le bon numéro de révision (en supposant que 123
pour les exemples ci-dessous).
Mise à jour à la dernière révision:
svn update
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 l'ancienne copie et que vous voulez simplement valider les fichiers actuellement sur votre PC:
Faites une copie de votre bonne version (mais sans aucun dossier .svn
):
cd ..
rsync -ai --exclude=.svn project/ project-good/
Maintenant, assurez-vous d'avoir la dernière version:
cd project
svn update
# or make a fresh checkout
svn checkout <url>
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.
Vous devriez pouvoir commettre ce que vous avez maintenant.
cd project
svn commit "Reverted to good copy"
Il suffit d'utiliser cette ligne
svn update -r yourOldRevesion
Vous pouvez connaître votre révision actuelle en utilisant:
svn info
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:
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é.
n peu plus old school
svn diff -r 150:140 > ../r140.patch
patch -p0 < ../r140.patch
alors l'habitude
svn diff
svn commit
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.
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.
Cela fera une fusion inversée, annulant les modifications dans votre copie de travail.
Il suffit de revoir le code et de s’engager.
Cliquez avec le bouton droit sur la hiérarchie supérieure que vous souhaitez rétablir >> Revert
ou Revert to Revision
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.
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:
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.
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.
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
À partir des pages de manuel.
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.
Synchronisez avec l'ancienne version et validez-la. Cela devrait faire l'affaire.
Voici également une explication de l'annulation des modifications.