Rétablissement d'un seul fichier dans SVN vers une révision particulière

182

J'ai un fichier comme indiqué ci-dessous dans un repo SVN que je voudrais revenir à une version précédente. Quelle est la manière de faire cela dans SVN? Je veux uniquement rétrograder ce fichier particulier vers une version plus ancienne, pas tout le dépôt.

Merci.

$ svn log myfile.py
----------------------
r179 | xx | 2010-05-10

Change 3
----------------------
r175 | xx | 2010-05-08

Change 2
----------------------
r174 | xx | 2010-05-04

Initial
Gökhan Sever
la source
quand vous avez dit revenir, que vouliez-vous dire, il y a 7 ans, lol
Kalpesh Soni

Réponses:

181

Si vous voulez juste l'ancien fichier dans votre copie de travail:

svn up -r 147 myfile.py

Si vous souhaitez revenir en arrière, voir ceci " Comment revenir à une ancienne version de notre code en subversion? ".

Eric Hauser
la source
8
mais la prochaine fois que vous mettez à jour, il récupère le fichier que vous ne vouliez pas récupérer ...: S
andygoestohollywood
2
si vous ne voulez pas le récupérer, svn commit ce fichier, pour mettre la version que vous voulez dans le dépôt
Packet Tracer
14
Cela ne fait probablement pas vraiment ce que le poseur de question voulait. En utilisant cela, la copie de travail est propre et ne peut pas être validée TELLE QUELLE, et une "mise à jour svn" sans numéro de version spécifié récupérera la dernière version indésirable.
CXJ
1
Comment puis-je alors valider le fichier rétabli?
marcio
2
Ce n'est pas tout à fait correct car, comme le mentionne CXJ, il n'y a pas de moyen de valider le fichier mis à jour. Vous voudrez probablement faire comme le dit Mitch Dempsey (notez cependant la --force pour forcer l'écrasement du fichier): svn export --force -r 147 myfile.py myfile.py
avejidah
76

svn cat prend aussi un argument de révision!

svn cat -r 175 mydir/myfile > mydir/myfile

Ne plus jamais dormir
la source
20
C'est de loin la meilleure réponse sur la page. Il laisse le fichier modifié dans un état qui peut être validé.
dotancohen
cela ne semble pas fonctionner lorsque vous collez dans un nouveau fichier
ahnbizcad
haha en y repensant, idk à quel contexte je pensais quand j'ai posté. Je ne m'en souviens pas. Cela semble insensé.
ahnbizcad
C'est simple et direct lorsque vous souhaitez simplement annuler vos modifications et remettre un fichier dans son état de pré-validation sans aucune technique de contrôle de version.
Anonyme
57
svn revert filename 

cela devrait rétablir un seul fichier.

l'étoile
la source
4
Que se passe-t-il avec toutes les autres réponses avec des commandes plus longues? Merci.
masterxilo
Je vous en prie. Je n'ai aucune idée de ce qui se passe avec les autres réponses .. lol
thestar
13
Cela revient à quelle révision? Doc dit simplement qu'il remplace par le dernier repo. La question est de savoir comment revenir à une version antérieure.
tgkprog
1
Cela revient à la dernière version de repo. Si vous lisez la description des questions, il semble qu'il cherchait comment restaurer un seul fichier, pas un répertoire entier.
thestar
5
Je crois que tout cela ne fait que détruire votre copie de travail en la «retournant» en arrière. Ou à qui jamais a été vérifié. confirmez en faisant svn update -r VER file, puis faites un svn revert.
Gerard ONeill
50

Pour un seul fichier, vous pouvez faire:

svn export -r <REV> svn://host/path/to/file/on/repos file.ext

Vous pouvez le faire, svn revert <file>mais cela ne restaure que la dernière copie de travail.

Mitch Dempsey
la source
2
exporter, puis collez-le dans votre copie locale, puis validez-le à nouveau?
tgkprog le
1
@tgkprog c'est une façon de le faire, oui
Mitch Dempsey
@tgkprog et quelle est la méthode "préférée"?
hbogert
Aucune idée mais c'est ce qui a fonctionné pour moi: la révision passée exportée. Ouvert dans le bloc-notes, copié, collé dans un fichier de travail. Engagé cela à la tête avec un commentaire sur quel rev et pourquoi. Les outils d'interface utilisateur pourraient avoir un meilleur moyen.
tgkprog
21

Jusqu'à présent, toutes les réponses ici semblent avoir des inconvénients importants, sont compliquées (besoin de trouver l'URI du repo) ou elles ne font pas ce que la question demandait probablement: Comment remettre le repo en état de marche avec cette ancienne version du fichier .

svn merge -r head:[revision-number-to-revert-to] [file-path]est l'OMI le moyen le plus propre et le plus simple de le faire. Veuillez noter que ramener un fichier supprimé ne semble pas fonctionner de cette façon [1]. Voir aussi la question suivante: Meilleure façon de revenir à une révision SVN précédente d'un fichier?

[1] Pour ce que vous voulez svn cp -r [rev-number] [repo-URI/file-path]@[rev-number] [repo-URI/file-path] && svn up, voir aussi Quelle est la bonne façon de restaurer un fichier supprimé de SVN?

Michel Müller
la source
Je tiens à remarquer qu'au moins pour ma version de Subversion, svn mergene prend pas plusieurs fichiers comme argument pour une raison quelconque. Dans ce cas, il semble ne rien faire (sans message d'erreur).
Wrzlprmft
Mais ma commande fonctionne toujours en la répétant pour chaque fichier, non?
Michel Müller
Oui, c'est vrai.
Wrzlprmft
1
Convenu que c'est le plus propre.
KevinG
13

Le meilleur moyen est de:

svn merge -c -RevisionToUndo ^/trunk

Cela annulera tous les fichiers de la révision au lieu de simplement restaurer les fichiers que vous n'aimez pas annuler. N'oubliez pas le tiret ( -) comme préfixe de la révision.

svn revert File1 File2

Maintenant, validez les modifications.

khmarbaise
la source
9

Vous voulez faire

svn merge -r [revision to revert from]:[revision to revert to] [path/filename]

Une fois que vous faites cela, vous aurez cette révision du fichier dans un état validable. Validez le fichier.

Jennifer Elyse
la source
7

J'ai trouvé qu'il était simple de le faire via la svn catcommande afin que vous n'ayez même pas à spécifier une révision.

svn cat mydir/myfile > mydir/myfile

Cela ne rendra probablement pas les données d'inode (métadonnées) telles que les horodatages.

Joseph Coco
la source
puis validez le fichier pour qu'il passe au
dépôt
3
Cela a fonctionné pour moi mieux que la mise à jour. Parce que la mise à jour ne vous permet pas de valider la modification apportée à ce fichier. (svn 1.8.3)
fe_lix_
7

surpris que personne n'ait mentionné cela

sans connaître le numéro de révision, vous pouvez écrire ceci, si vous venez de valider quelque chose que vous voulez restaurer, cela ne fonctionnera pas si vous avez changé un autre fichier et que le fichier cible n'est pas le dernier fichier modifié

svn merge -r HEAD:PREV file
Kalpesh Soni
la source
si vous avez des commentaires, veuillez en discuter ici avant d'apporter des modifications?
Kalpesh Soni
1
Le scénario de la question ne nécessite-t-il pas une fusion inversée du changement le plus récent, de sorte que nous devrions appliquer les changements nécessaires pour passer de HEAD à PREV?
Nick Russo
4
La commande devrait être svn merge -r HEAD:PREV filecomme l'a dit @Nick Russo
Heinz
4

S'il ne s'agit que de quelques fichiers et si vous utilisez Tortoise SVN, vous pouvez utiliser l'approche suivante:

  1. Faites un clic droit sur votre fichier source et sélectionnez "TortoiseSVN" -> "Afficher le journal".
  2. Cliquez avec le bouton droit sur une révision dans le journal et sélectionnez "Enregistrer la révision dans ...".
  3. Laissez l'ancienne révision écraser votre fichier actuel.
  4. Validez le fichier source écrasé.
Elling
la source
Cela enregistre un nouveau fichier non versionné tel que file-xxxx où xxxx est l'ancien numéro de révision. Que faisons-nous ensuite? supprimer la nouvelle révision (HEAD par exemple), renommer le nouveau fichier, ajouter, valider?
Heinz
Non, ne l'enregistrez pas avec le numéro de révision dans le nom du fichier. Enregistrez-le avec exactement le même nom de fichier que la version actuelle du même fichier (en d'autres termes, pas de xxxx dans le nom de fichier). Ensuite, faites simplement un commit ordinaire après cela.
Elling le
4

Je viens d'ajouter à la réponse @Mitch Dempsy car je n'ai pas encore assez de représentant pour commenter.

svn export -r <REV> svn://host/path/to/file/on/repos --force

L'ajout de --force écrasera la copie locale avec l'exportation et vous pourrez ensuite faire un commit svn pour le pousser vers le référentiel.

Kristina
la source
et c'est la meilleure réponse :)
Zgr3doo
pourquoi est-ce la meilleure réponse? il ne gère pas l'histoire à la "façon svn"
Jason S
2

Une autre option pour un seul fichier consiste à "remplacer" la version actuelle du fichier par la révision la plus ancienne:

svn rm file.ext
svn cp svn://host/path/to/file/on/repo/file.ext@<REV> file.ext
svn ci

Cela a pour fonction supplémentaire que les modifications indésirables n'apparaissent pas dans le journal de ce fichier (c'est-à-dire svn log file.ext).

Robert Leland
la source
1

Si vous souhaitez restaurer un fichier individuel à partir d'une révision spécifique et pouvoir valider, procédez comme suit:

svn merge -c - [OldRev #] [Nom de fichier]

c'est à dire. svn merge -c -150 myfile.py

Notez le négatif sur le numéro de révision

Olmstov
la source
-1
sudo svn revert filename

c'est la meilleure façon de restaurer un seul fichier

mallikarjun SK
la source
2
J'espère vraiment que vous ne vous rapprocherez jamais d'une machine de production avec des autorisations sudoer.
David Lakatos