2009-07-23 5 views
1

Quoi, quelqu'un dans mon équipe a fait une "erreur" pour supprimer plusieurs fichiers dans la révision actuelle du référentiel d'équipe. Est-il possible de mettre à jour la version locale actuelle vers la révision de la tête? Lorsque je clique sur valider, subclipse ne reconnaît pas les fichiers manquants pour les télécharger.SVN - Mettre à jour la copie locale complète vers HEAD Version

Merci à l'avance,
RAYT

+0

Je ne comprends pas très bien votre question, mais avant d'essayer quoi que ce soit, faites une sauvegarde rapide du répertoire avec la révision locale. – Elijah

+0

désolé, corrigé une phrase. devrait faire plus de sens maintenant. –

Répondre

9

Oh, pour l'amour de Pete! Le . réponses à ce jour ont été - au mieux - trompeur

De votre question, il semble que vous essayiez quelque chose comme ceci:

svn update -r8 
# ok, I can see the deleted file now 
svn commit -m "I want r8 to be newest" 

Sauf que ne fonctionnera pas il n'y a aucune modification. Vous pouvez mettre à jour vers des révisions plus anciennes, mais vous ne pouvez pas y apporter de changements. Vous ne pouvez pas changer le passé. Vous ne pouvez commettre une nouvelle révision qu'en annulant les dégâts.

Ok, supposons que votre référentiel soit à svn: // repo. Voici un exemple simplifié dans lequel le tronc du dossier contient deux fichiers, "a" et "b". Appelons cette révision 8 (r8).

trunk # working copy of svn://repo/trunk 
    a 
    b 

J.R Hacker, glisse et supprime accidentellement b:

svn rm b 
svn commit -m "oops" 

Appelons le résultat de ce commit r9.

Alors, la prochaine fois que vous mettez à jour à partir du référentiel,

svn update 

trunk 
    a 

b disparaît! Panique? Non. Ceci est un système de contrôle de version. Tout ce qui a été vérifié peut être restauré. Voici deux possibilités:

Juste copie le fichier à partir d'une version plus ancienne, à savoir la dernière révision où il existait encore: 8.

svn cp svn://repo/trunk/[email protected] . 
svn commit -m "restored b from revision 8" 

La solution plus générale est d'utiliser une fusion. Vous pouvez utiliser cette technique pour annuler plus qu'une simple suppression.

svn merge -r9:8 . . 
svn commit -m "reverted the changes made in revision 8" 

La façon de lire cette fusion est la suivante:

figure d'abord quels changements doivent être faits pour obtenir de r9 (retour) à r8 du dossier référentiel (svn: // repo/tronc) associé au répertoire courant (le premier "."). Maintenant, effectuez ces modifications sur la copie de travail dans le répertoire en cours (le second ".").

Il y a une syntaxe plus pratique si vous êtes juste revenir un seul changement:

svn merge -c-8 . . #note the minus sign before the 8 

Si vous ne l'utilisez svn de la ligne de commande, fouillez votre outil un peu, vous êtes sûr de trouver quelque chose. TortoiseSVN, par exemple a le pratique "annuler les modifications de cette révision" lorsque vous ouvrez un journal à partir d'une copie de travail.

+0

Il m'a semblé comme quelqu'un d'autre supprimé les fichiers, il n'avait pas mis à jour et avait toujours les fichiers dans son référentiel local, et il voulait en quelque sorte les commettre «sur» le commit précédent, qui Bien sûr, cela ne marcherait pas. Oui, une fusion fonctionne. Oui, en prenant une copie de ses fichiers locaux, en les mettant à jour et en les remettant en état de marche. S'il vous plaît laissez des commentaires lorsque vous modérez vers le bas. – JeeBee

+0

Dans subversion, il n'y a pas de "référentiels locaux" il n'y a qu'un seul dépôt et * copie de travail de l'utilisateur *. Une suppression svn accidentelle sur une partie d'une * copie de travail * qui n'a pas été validée peut être annulée avec svn revert. – bendin

1

Prenez une copie des fichiers supprimés en SVN de votre révision quelque part (par exemple, un dossier temporaire sur votre bureau), puis mise à jour (qui supprime les fichiers originaux , conformément à l'action de suppression validée de votre collègue), puis déplacez vos copies et retournez-les dans SVN.

+0

Cette approche perdra la connexion historique au fichier supprimé accidentellement et stockera le même fichier (contenu) deux fois dans le référentiel, sauf si vous utilisez au moins svn 1.6 sur le serveur. – bendin

0

je ferais ce qui suit:

Trouver le numéro de révision avant la suppression ... faire une -R1 svnadmin dump: [goodrevisionnumber ici]> file.dump.

Créez ensuite un nouveau référentiel, "svnadmin create [nom du référentiel]", puis chargez le vidage dans le nouveau référentiel. « Svnadmin load [newrepositoryname] < file.dump.

Ensuite, consultez cette révision, et copiez les fichiers de l'ancien caisse dans la nouvelle et commettre.

+0

perdons-nous toutes les révisions précédentes? –

+0

non ... lorsque vous faites la sauvegarde, vous spécifiez de la révision 1 à la bonne révision. Quand vous chargez, il commettra à nouveau chaque commit précédent. – tardomatic

+0

qui l'a fait! merci –