SVN - Mettre à jour la version locale complète de la version à tête
Question
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 possible de mettre à jour la version locale actuelle à la révision de la tête? Lorsque je clique sur Commit, Subclipse ne reconnaît pas les fichiers manquants pour les télécharger.
Merci d'avance,
rayt
La solution
Oh, pour l'amour de Pete! Jusqu'à présent, les réponses ont été - au mieux - trompeuses.
D'après 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 cela ne fonctionnera pas. Il n'y a aucune modification à commettre. Vous pouvez mettre à jour les anciennes révisions, mais vous ne pouvez pas y apporter de modifications. Vous ne pouvez pas changer le passé. Vous ne pouvez commettre qu'une nouvelle révision, annulant les dégâts.
Ok, supposons que votre référentiel est au SVN: // Repo. Ici, un exemple simplifié dans lequel le coffre de dossier contient deux fichiers, "A" et "B". Appelons cette révision 8 (R8).
trunk # working copy of svn://repo/trunk
a
b
Jr Hacker, glisse et supprime accidentellement B:
svn rm b
svn commit -m "oops"
Appelons la validation qui en résulte R9.
Donc, la prochaine fois que vous mettez à jour à partir du référentiel,
svn update
trunk
a
B disparaît! Panique? Non. Il s'agit d'un système de contrôle de version. Tout ce qui a été enregistré peut être restauré. Voici deux possibilités:
Juste copie Le fichier d'une révision plus ancienne, c'est-à-dire la dernière révision où elle existait encore: 8.
svn cp svn://repo/trunk/b@8 .
svn commit -m "restored b from revision 8"
La solution la plus générale consiste à utiliser un fusionner. Vous pouvez utiliser cette technique pour annuler plus qu'une simple suppression parasite.
svn merge -r9:8 . .
svn commit -m "reverted the changes made in revision 8"
La façon de lire cette fusion est:
Déterminez d'abord les changements à apporter pour passer de R9 (arrière) à R8 du dossier du référentiel (svn: // repo / trunk) associé au répertoire actuel (le premier "."). Maintenant, effectuez ces modifications sur la copie de travail dans le répertoire actuel (le second ".").
Il y a une syntaxe plus pratique si vous restez simplement un seul changement:
svn merge -c-8 . . #note the minus sign before the 8
Si vous n'utilisez pas SVN à partir de la ligne de commande, passez un peu autour de votre outil, vous êtes sûr de trouver quelque chose. TortoiseSVN, par exemple, a les «modifications de retour de cette révision» pratiques lorsque vous ouvrez un journal à partir d'une copie de travail.
Autres conseils
Prenez une copie des fichiers supprimés dans votre révision quelque part (par exemple, un dossier temporaire sur votre bureau), puis met à jour (qui supprimera les fichiers d'origine, selon l'action de suppression engagée de votre collègue), puis retirez vos copies et les engager dans SVN.
Je ferais ce qui suit:
Trouvez le numéro de révision avant la suppression ... Faites un svnadmin Dump -R1: [GOODREVISIONNUMBER ICI]> file.dump.
Ensuite, créez 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 paiement dans le nouveau et engagez-vous.