68 votes

Un moyen sain de renommer un répertoire dans la copie de travail de subversion

Bien que quelque peu versé dans la VCS (régulier svn, git git-svn utilisateur) je n'arrive pas à envelopper ma tête autour de ce singulier SVN comportement.

Chaque fois que j'ai besoin de renommer un répertoire dans mon SVN copie de travail à partir d'un "propre" de l'état - je.e svn status ne retourne rien et tous les autres modifications ont été commis - like (ce qui est ce que le svn doc indique):

svn mv foo bar
svn commit

SVN se plaint bruyamment:

Adding         bar
Adding         bar/toto
Deleting       foo
svn: Commit failed (details follow):
svn: Item '/test/foo' is out of date

Comme vous le souhaitez:

svn update

Ce qui donne:

   C foo
At revision 46.
Summary of conflicts:
  Tree conflicts: 1

Il y a un arbre de conflit, alors qu'aucun tiers changement qui s'est passé. De toute évidence, la seule façon de sortir de cet arbre conflit mess est de manière générale (à partir du svn livre rouge):

svn resolve --accept working -R .
svn commit

De le renommer à distance sur le repo de mettre à jour la copie de travail semble assez braindead:

url=$(svn info | grep -e '^URL:' | sed 's/^URL: //') svn mv $url/foo $url/bar
svn update

Est-il sanctionné, plus simple façon de renommer un dossier que je suis absent? Quelle est la cause fondamentale de particulièrement surprenant arbre de conflit de l'état?

69voto

Albin Sunnanbo Points 30722

svn mv fonctionne pour moi:

C:\svn\co>svn mv my_dir new_dir
A         new_dir
D         my_dir\New Text Document.txt
D         my_dir


C:\svn\co>svn commit -m foo
Raderar             my_dir
Lägger till         new_dir

Arkiverade revision 2.

C:\svn\co>

Désolé pour le suédois sortie de svn.

Il doit y avoir autre chose qui ne va pas dans votre cas.

Edit:
Comme l'a souligné dans les commentaires par Lloeki

Pour reproduire le problème, vous devez mettre à jour et de commettre un fichier contenu dans le dossier, mais ne pas mettre à jour le dossier lui-même.

fichier de commettre crée un nouveau rev n sur la repo, mais les métadonnées n'est pas mis à jour (comme il l'a toujours, voir svn journal après tout commit) , ainsi dir les métadonnées sont au rev n-1. Il suit que svn ne pas commettre en raison de la les métadonnées de diff, et il ne sera pas mise à jour parce qu'il y a en effet un conflit sur le dir: mise à jour des métadonnées vs supprimer.

Le comportement est "prévu" et la "solution" est de mettre à jour la copie de travail avant l'émission de l' svn rename commande.

8voto

sdaau Points 6262

OK, je suis tombé sur ce - et peut enfin reconstruire le problème avec une simple session de terminal: le problème se produit si vous svn mv (déplacer/renommer un fichier, puis s'engager à ce que le changement; puis (sans faire un svn update en premier) svn mv le répertoire parent du fichier dont le déplacer/renommer était déjà engagé, et, finalement, faire un svn commit sur le changement de nom de répertoire - ou accepté de répondre : "vous avez également besoin de mettre à jour et de commettre un fichier contenu dans le dossier, mais ne pas mettre à jour le dossier lui-même"; mais tout cela exécuté dans un parent (ou plutôt, l'ancêtre) répertoire. Voici la ligne de commande de journal montrant le problème:

$ cd /tmp
$ svnadmin create myrepo
$ svn co file:///tmp/myrepo myrepo-wc
Checked out revision 0.

$ cd myrepo-wc/
$ mkdir -p dir1/dir2/dir3
$ svn add dir1/
A         dir1
A         dir1/dir2
A         dir1/dir2/dir3

$ svn ci -m 'add dir1/'
Adding         dir1
Adding         dir1/dir2
Adding         dir1/dir2/dir3

Committed revision 1.

$ echo test1 >> dir1/dir2/dir3/test1.txt
$ echo test2 >> dir1/dir2/dir3/test2.txt
$ svn add dir1/
svn: warning: 'dir1' is already under version control
$ svn add dir1/*
svn: warning: 'dir1/dir2' is already under version control
$ svn add dir1/dir2/dir3/*
A         dir1/dir2/dir3/test1.txt
A         dir1/dir2/dir3/test2.txt
$ svn status
A       dir1/dir2/dir3/test2.txt
A       dir1/dir2/dir3/test1.txt
$ svn ci -m 'add dir1/dir2/dir3/*'
Adding         dir1/dir2/dir3/test1.txt
Adding         dir1/dir2/dir3/test2.txt
Transmitting file data ..
Committed revision 2.

$ svn mv dir1/dir2/dir3/test2.txt dir1/dir2/dir3/test2X.txt
A         dir1/dir2/dir3/test2X.txt
D         dir1/dir2/dir3/test2.txt
$ svn status
D       dir1/dir2/dir3/test2.txt
A  +    dir1/dir2/dir3/test2X.txt
$ svn ci -m 'mv dir1/dir2/dir3/test2.txt dir1/dir2/dir3/test2X.txt'
Deleting       dir1/dir2/dir3/test2.txt
Adding         dir1/dir2/dir3/test2X.txt

Committed revision 3.

$ svn status
$ svn mv dir1/dir2/dir3 dir1/dir2/dir3X
A         dir1/dir2/dir3X
D         dir1/dir2/dir3/test2X.txt
D         dir1/dir2/dir3/test1.txt
D         dir1/dir2/dir3
$ svn status
D       dir1/dir2/dir3
D       dir1/dir2/dir3/test2X.txt
D       dir1/dir2/dir3/test1.txt
A  +    dir1/dir2/dir3X
D  +    dir1/dir2/dir3X/test2.txt
$ svn ci -m 'mv dir1/dir2/dir3 dir1/dir2/dir3X'
Deleting       dir1/dir2/dir3
svn: Commit failed (details follow):
svn: Directory '/dir1/dir2/dir3' is out of date
$ svn status
D       dir1/dir2/dir3
D       dir1/dir2/dir3/test2X.txt
D       dir1/dir2/dir3/test1.txt
A  +    dir1/dir2/dir3X
D  +    dir1/dir2/dir3X/test2.txt
$ svn up
   C dir1/dir2/dir3
At revision 3.
Summary of conflicts:
  Tree conflicts: 1

Et c'est comment il devrait avoir été faire un svn up après que le fichier déplacer/renommer était partie prenante; notez la façon dont les numéros de version rapporté par svn status -v changement après l' svn update commande:

$ cd /tmp
$ rm -rf myrepo*

$ svnadmin create myrepo
$ svn co file:///tmp/myrepo myrepo-wc
Checked out revision 0.

$ cd myrepo-wc/
$ mkdir -p dir1/dir2/dir3
$ svn add dir1/
A         dir1
A         dir1/dir2
A         dir1/dir2/dir3
$ svn ci -m 'add dir1/'
Adding         dir1
Adding         dir1/dir2
Adding         dir1/dir2/dir3

Committed revision 1.

$ echo test1 >> dir1/dir2/dir3/test1.txt
$ echo test2 >> dir1/dir2/dir3/test2.txt
$ svn add dir1/dir2/dir3/*
A         dir1/dir2/dir3/test1.txt
A         dir1/dir2/dir3/test2.txt
$ svn status
A       dir1/dir2/dir3/test2.txt
A       dir1/dir2/dir3/test1.txt
$ svn ci -m 'add dir1/dir2/dir3/*'
Adding         dir1/dir2/dir3/test1.txt
Adding         dir1/dir2/dir3/test2.txt
Transmitting file data ..
Committed revision 2.

$ svn mv dir1/dir2/dir3/test2.txt dir1/dir2/dir3/test2X.txt
A         dir1/dir2/dir3/test2X.txt
D         dir1/dir2/dir3/test2.txt
$ svn status
D       dir1/dir2/dir3/test2.txt
A  +    dir1/dir2/dir3/test2X.txt
$ svn ci -m 'mv dir1/dir2/dir3/test2.txt dir1/dir2/dir3/test2X.txt'
Deleting       dir1/dir2/dir3/test2.txt
Adding         dir1/dir2/dir3/test2X.txt

Committed revision 3.

$ svn status
$ svn status -v
                 0        0  ?           .
                 1        1 username dir1
                 1        1 username dir1/dir2
                 1        1 username dir1/dir2/dir3
                 3        3 username dir1/dir2/dir3/test2X.txt
                 2        2 username dir1/dir2/dir3/test1.txt
$ svn up
At revision 3.
$ svn status -v
                 3        3 username .
                 3        3 username dir1
                 3        3 username dir1/dir2
                 3        3 username dir1/dir2/dir3
                 3        3 username dir1/dir2/dir3/test2X.txt
                 3        2 username dir1/dir2/dir3/test1.txt
$ svn mv dir1/dir2/dir3 dir1/dir2/dir3X
A         dir1/dir2/dir3X
D         dir1/dir2/dir3/test2X.txt
D         dir1/dir2/dir3/test1.txt
D         dir1/dir2/dir3
$ svn status
D       dir1/dir2/dir3
D       dir1/dir2/dir3/test2X.txt
D       dir1/dir2/dir3/test1.txt
A  +    dir1/dir2/dir3X
$ svn ci -m 'mv dir1/dir2/dir3 dir1/dir2/dir3X'
Deleting       dir1/dir2/dir3
Adding         dir1/dir2/dir3X

Committed revision 4.

$ svn status
$ svn status -v
                 3        3 username .
                 3        3 username dir1
                 3        3 username dir1/dir2
                 4        4 username dir1/dir2/dir3X
                 4        4 username dir1/dir2/dir3X/test2X.txt
                 4        4 username dir1/dir2/dir3X/test1.txt
$ svn up
At revision 4.
$ svn status -v
                 4        4 username .
                 4        4 username dir1
                 4        4 username dir1/dir2
                 4        4 username dir1/dir2/dir3X
                 4        4 username dir1/dir2/dir3X/test2X.txt
                 4        4 username dir1/dir2/dir3X/test1.txt

Et que l'OP dit - faut-il oublier de faire l' svn update avant qu'une nouvelle déplacer/renommer+commettre, et la "Validation a échoué" s'est produite, alors on peut utiliser svn resolve --accept working -R . à être en mesure de terminer la validation de l'action.

1voto

xgretsch Points 452

Cela a fonctionné pour moi:

 vi someotherfile
...various changes to the other file
svn mv olddir newdir
svn commit -m"Moved olddir out of the way" olddir
svn commit -m"New location of olddir" newdir
svn update
svn commit -m"Changed someotherfile" someotherfile
 

Je soupçonne qu'il y avait plusieurs autres moyens possibles et qu'avoir un répertoire de travail propre avant de faire svn mv aurait également fait l'affaire.

0voto

zellus Points 7713

On pourrait penser à un scénario dans lequel le répertoire a été modifié dans le référentiel par un autre utilisateur. Renommer le même dossier dans votre copie de travail peut déclencher des conflits d'arborescence lors de la validation.

La résolution des conflits montre comment résoudre les "conflits d'arborescence" dans Subversion.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X