web-dev-qa-db-fra.com

Annule ou rétablit le référentiel svn entier en une révision plus ancienne

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!

74
nlaq

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

26
Justin Love

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]

25
luapyad

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
14
Sander Rijken

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.

13
fuenfundachtzig

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)

6
MarcH

Pour ceux qui utilisent TortoiseSVN, la solution est simple:

  • afficher le journal des modifications
  • cliquez avec le bouton droit sur la révision à laquelle vous souhaitez revenir ...
  • ... sélectionnez "Revenir à cette révision"
  • commettre vos modifications

Cette méthode conserve l’historique des versions (c’est-à-dire toutes les révisions que vous avez annulées).

5
Paul Suart

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
3
nickf

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.

2
genehack

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.

2
neesh

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?

1
Juan

Pourriez-vous svn del les répertoires supérieurs, puis svn copy les:

svn copy svnurl@version svnurl 
1
Lyndon

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

0
Kent Fredric

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

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

0
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"
0
Mazrick