Dans SVN, comment copier uniquement les sous-répertoires d'un répertoire dans un autre répertoire?
Question
En ligne de commande, je fais habituellement ceci:
cp -rRp /path/to/a\_folder/. /path/to/another\_folder
Ceci copie uniquement le contenu situé sous un dossier dans un autre dossier . Dans SVN, je dois faire la même chose, mais je ne peux pas le comprendre. Je finis toujours avec ceci:
/path/to/another\_folder/a\_folder
SVN vomit même quand j'essaie ceci:
svn copy file:///path/to/a\_folder/* file:///path/to/another\_folder
Cela dit que ça n'existe pas.
EDIT:
Cela aiderait probablement. La structure de répertoire de mon projet se présente comme suit:
my_project
/branches
/tags
/trunk
/vendor
/1.1
Je dois obtenir le contenu du fournisseur 1.1 sous le fournisseur dans le coffre sans que celui-ci ne copie réellement le dossier 1.1.
La solution
Avez-vous envisagé d'utiliser svn merge?
Avec un repo comme celui-ci:
trunk/a_folder/foo
trunk/a_folder/bar
trunk/new_folder/baz
utilisez ces commandes pour fusionner les répertoires foo et bar:
cd trunk/new_folder
svn merge -r1:HEAD http://svn/repo/trunk/a_folder .
Autres conseils
Comme vous l'avez certainement découvert, la copie dans un répertoire cible existant ne fonctionnera pas:
svn cp svn://my_project/vendor/1.1 svn://my_project/trunk
car le tronc existe déjà, vous allez donc vous retrouver avec:
svn://my_project/trunk/1.1
L'utilisation de fusion a la propriété regrettable de ne pas conserver l'historique de la balise 1.1 du fournisseur dans Subversion antérieure à la version 1.5 qui avait introduit le suivi de la fusion. Vous ne vous en souciez peut-être pas. Dans ce cas, fusionner serait la bonne solution:
svn co svn://my_project/trunk trunk-wc svn merge svn://my_project/trunk svn://my_project/vendor/1.1 trunk-wc
La meilleure façon de lire cette fusion est la suivante: Déterminez d’abord les modifications nécessaires pour rendre trunk
identique à vendor / 1.1
, puis appliquez ces modifications à la copie de travail donnée. (également du coffre, dans ce cas).
Je tiens à souligner que cette fusion éliminera effectivement tout ce qui se trouvait auparavant dans le coffre. Par conséquent, si vous avez déjà des modifications locales (non-fournisseur) sur le coffre, vous ne souhaitez appliquer que les modifications entre la version 1.1 et la livraison précédente du fournisseur:
svn co svn://my_project/trunk trunk-wc svn merge svn://my_project/vendor/1.0 svn://my_prjoect/vendor/1.1 trunk-wc
Si le tronc existe mais qu'il est vide , vous avez le choix: remplacer le tronc ou écrire une petite boucle de shell:
Le remplacement du coffre ressemble à ceci:
svn rm svn://my_project/trunk svn cp svn://my_project/vendor/1.1 svn://my_project/trunk
Exploitation du shell (bash):
svn co svn://my_project/trunk trunk svn co svn://my_project/vendor/1.1 1.1 ( cd 1.1 for x in * ; do svn cp $x ../trunk done ) svn ci trunk
Ce lien explique une solution de contournement.
http://svn.haxx.se/users/archive- 2004-12 / 1537.shtml
En gros, cela indique que si le dossier de destination n’existe pas dans le référentiel, vous obtiendrez les contacts de votre dossier source dans le dossier de destination.
Voir l'exemple ci-dessous. Le dossier 07-03-2012 n'existe pas dans votre référentiel. Une fois que vous avez exécuté la commande ci-dessous, vous obtiendrez le contenu du dossier HEAD au 07-03-2012.
svn cp <URL>/HEAD/ <URL>/branches/07-03-2012 -m "test"
Je pense que ce que vous voulez, c'est que le contenu du coffre se retrouve dans le dossier /tags/version-1.0 /
sans qu'il y ait un dossier supplémentaire / trunk
. Là. C'est mauvais: /tags/version-1.0/trunk/stuff
. C’est bien: /tags/version-1.0/stuff
.
Pour obtenir cela, je fais un processus en 2 étapes:
svn copy http://localhost/MyProject/trunk http://localhost/MyProject/tags/
# now I have /MyProject/tags/trunk
svn rename http://localhost/MyProject/tags/trunk http://localhost/MyProject/tags/version-1.0
Vous êtes très très proche:
svn copy -m"Copy Directory" file:///path/to/a_folder file:///path/to/another_folder
supprimez simplement le / *
du premier argument.