Je me suis planté dans mon référentiel SVN et je dois maintenant rétablir l'intégralité du référentiel de la révision 28 à la révision 24 et je ne souhaite pas gérer les différences ou les conflits. Existe-t-il un moyen simple et rapide de procéder? J'ai été en mesure de restaurer des fichiers individuels avant la fin avec la commande de fusion - mais dans ce cas, il souhaite rajouter tous les fichiers dans le référentiel à partir de la révision 28 alors que tout ce que je veux, c'est les supprimer.
J'utilise la ligne de commande sur une boîte Linux (bash).
Merci
MODIFIER
Merci pour toute l'aide! Je l'ai corrigé par:
svnadmin create /svnroot/<repo>.fixed
svnadmin dump -r 1:24 /svnroot/<repo> --incremental > dump.svn
svnadmin load /svnroot/<repo>.fixed < dump.svn
Placez ensuite l’ancien dépôt dans un emplacement de sauvegarde et déplacez le fichier repo.fixed vers le dépôt.
Merci encore!
Découvrez svnadmin dump/load. Il crée un fichier texte avec chaque version de vos fichiers. Il peut être possible de supprimer tout ce qui se situe au-dessus/au-dessous d'un certain point et de le réimporter.
Voir par exemple Migration des données du référentiel ailleurs
Une fusion "inverse" peut être ce dont vous avez besoin. Voir "annuler les modifications" section de svn book.
Par exemple. svn merge -r 28:24 [chemin d'accès à svn]
Si vous devez vraiment effacer les preuves que les fichiers ont déjà existé, vous devez effectuer les actions svndump/svnload décrites ci-dessus.
Dans une situation «normale», où vous avez commis une erreur, vous devez utiliser la fusion inversée. Cela vous assure que l'annulation des modifications après r24 peut également être annulée, différée, etc.
La commande ci-dessous devrait annuler vos modifications (vous devez valider le résultat de la fusion afin de refléter la fusion dans le référentiel).
svn merge -r 28:24
Si vous avez accès au serveur SVN, vous pouvez simplement éditer path/db/current
, y placer l'ancien numéro de révision auquel vous souhaitez revenir (ici: 24) et supprimer les fichiers de révision dont vous n'avez plus besoin (à savoir 25, 26, 27, 28). path/db/revs/0/
. Au moins, cela a fonctionné pour moi aujourd'hui, après avoir accidentellement supprimé un répertoire du référentiel.
Si vous ne vous prévalez pas des droits d'administrateur, vous ne pouvez pas effacer les anciennes révisions MAIS vous pouvez toujours les masquer extrêmement bien avec une simple commande "svn copy" incroyablement simple (nickf et JesperE l'ont déjà mentionné, mais d'une manière plutôt cryptique)
svn delete protocole: // svnserver/some/resource
svn copy protocole: // svnserver/some/resource @ 24 protocole: // svnserver/some/resource
Et voilà, les révisions 25 à 28 ont complètement disparu de svn log. Ce n'est pas du tout un hack, c'est une fonctionnalité documentée (à peine ...) documentée.
Si "ressource" est un répertoire, vous devez le retirer de la dernière URL:
protocole svn copy: // svnserver/some/directory @ 24 protocole: // svnserver/some /
(sinon vous le copiez à l'intérieur de lui-même)
Pour ceux qui utilisent TortoiseSVN, la solution est simple:
Cette méthode conserve l’historique des versions (c’est-à-dire toutes les révisions que vous avez annulées).
Vous pouvez effectuer une nouvelle extraction d'une révision particulière. http://svnbook.red-bean.com/fr/1.1/re04.html
svn co path/to/my/repo -r 24
Si vous voulez vraiment supprimer complètement les fichiers du référentiel, vous devez créer un svndump dans un fichier, filtrer les révs et/ou les chemins de fichiers que vous ne voulez pas, créer un nouveau référentiel, et svnloader le dump filtré dans le nouveau. dépôt. Avant de commencer, lisez attentivement la section du livre SVN sur la maintenance du référentiel et veillez à ne pas supprimer le référentiel existant tant que vous n'êtes pas sûr vouloir.
Si la structure de dossiers de votre application n'a pas changé, extrayez l'ancienne révision et remplacez les dossiers .svn de la dernière révision par l'ancienne révision extraite. Maintenant, vous pouvez commettre la "plus ancienne" version.
Je déteste dire cela, mais c'est une situation où je me suis retrouvé à utiliser des sauvegardes de mon référentiel svn.
Pouvez-vous copier les fichiers d’une révision donnée dans un nouveau répertoire du référentiel?
Pourriez-vous svn del
les répertoires supérieurs, puis svn copy
les:
svn copy svnurl@version svnurl
voici comment je commencerais à le faire. Brutal, oui, mais c’est la seule garantie d’ignorer complètement les collisions et garder l’historique des révisions intact.
cd /scratchdir
svn co -r good svn://repository
cd /hosed_project
svn up -r HEAD
cat >> /tmp/cp.sh
ORIG=$1
TARG=$( echo $ORIG | sed 's/\/scratchdir\///' );
cp $ORIG /hosed_project/$TARG;
^D
chmod u+x /tmp/cp.sh
find /scratchdir -not -wholename "*/.svn*" -exec /tmp/cp.sh {} \;
Notez que ce n’est pas la méthode "normale" IMO, la méthode normale consiste à créer une branche à partir d’une ancienne version, puis à la fusionner dans la tête. (du moins, c'est comme ça que tilisé pour fonctionner)
Modifier: le code ci-dessus n'est pas testé, ne l'exécutez PAS mot pour mot
Je ne suis pas tout à fait sûr si cela fonctionne, car je ne l'ai pas encore utilisé dans une production en direct, mais je viens tout juste d'essayer un référentiel de test (j'ai copié l'un de mes fichiers de production) et il semble fonctionner.
Lorsque vous êtes dans votre référentiel, utilisez la commande suivante:
svn update -r 24 trunk
Où 24 est le numéro de révision et trunk est le fichier/dossier que vous souhaitez mettre à jour (ou restaurer, dans ce cas) vers ce numéro de révision.
Lors de mon test, plusieurs fichiers ont été mis à jour et (ré) ajoutés, et après avoir effectué une validation, je n'ai reçu aucun avertissement. J'ai ensuite modifié un fichier avec du texte factice et essayé encore un autre commit, et seul ce fichier est apparu dans la liste modifiée. Cela semble donc fonctionner plutôt bien!
Encore une fois, je n’avais jamais utilisé cela auparavant dans des productions en direct, alors si je me trompe, donnez des conseils. J'aimerais aussi savoir si c'est la voie à suivre, car je me vois devoir en avoir besoin dans un avenir (proche).
-Dave
Example:
Rev 100 all is working great
Rev 101 somebody really corrupted the dir structure and / or merged in bad changes, etc.
Rev 102 You delete /trunk
Rev 103 You copy /trunk@100 to HEAD
You now have a /trunk that reflects only Rev 100 and 103. Not 101 or 102.
svn del svn://[RepoName]/trunk -m "removing issue in HEAD"
svn copy svn://[RepoName]/trunk@100 svn://[RepoName]/trunk -m "Copy of correct revision of trunk to HEAD"