En SVN, ¿cómo copio solo los subdirectorios de un directorio a otro directorio?
Pregunta
A través de la línea de comando, generalmente hago esto:
cp -rRp /path/to/a\_folder/. /path/to/another\_folder
Esto copia solo el contenido debajo de una_carpeta en otra_carpeta . En SVN necesito hacer lo mismo, pero no puedo entenderlo. Siempre termino con esto:
/path/to/another\_folder/a\_folder
SVN vomita incluso cuando intento esto:
svn copy file:///path/to/a\_folder/* file:///path/to/another\_folder
Dice que no existe.
EDIT:
Esto probablemente ayudaría. La estructura de directorios para mi proyecto se ve así:
my_project
/branches
/tags
/trunk
/vendor
/1.1
Necesito obtener el contenido de 1.1 del proveedor en el tronco sin que realmente copie la carpeta 1.1.
Solución
¿Ha considerado usar svn merge?
Dado un repositorio como este:
trunk/a_folder/foo
trunk/a_folder/bar
trunk/new_folder/baz
use estos comandos para fusionar los directorios foo y bar:
cd trunk/new_folder
svn merge -r1:HEAD http://svn/repo/trunk/a_folder .
Otros consejos
Como seguramente descubrió, copiar a un directorio de destino que ya existe no funcionará:
svn cp svn://my_project/vendor/1.1 svn://my_project/trunk
porque el tronco ya existe, por lo que terminaría con:
svn://my_project/trunk/1.1
El uso de fusión tiene la desafortunada propiedad de no mantener el historial de la etiqueta del proveedor 1.1 en subversión anterior a la 1.5 que introdujo el seguimiento de fusión. Puede que no te importe. En este caso, fusionar sería la solución correcta:
svn co svn://my_project/trunk trunk-wc svn merge svn://my_project/trunk svn://my_project/vendor/1.1 trunk-wc
La mejor manera de leer esta combinación es: Primero determine los cambios necesarios para hacer que trunk
sea idéntico a vendor / 1.1
, luego aplique esos cambios a la copia de trabajo dada (también de baúl, en este caso).
Debo señalar que esta fusión efectivamente eliminará todo lo que estaba en el tronco previamente. Entonces, si ya tiene modificaciones locales (no de proveedores) en el enlace troncal, querrá aplicar solo los cambios entre 1.1 y la caída del proveedor anterior:
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 tronco existe, pero está vacío , tiene dos opciones: reemplazar el tronco o escribir un pequeño bucle de shell:
Reemplazar el tronco se ve así:
svn rm svn://my_project/trunk svn cp svn://my_project/vendor/1.1 svn://my_project/trunk
Aprovechando el 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
Este enlace explica una solución alternativa.
http://svn.haxx.se/users/archive- 2004-12 / 1537.shtml
Básicamente, lo que dice es que si la carpeta de destino no existe en el repositorio, obtendrá los contenidos de su carpeta de origen en la carpeta de destino.
Vea el siguiente ejemplo. La carpeta 07-03-2012 no existe en su repositorio. Una vez que ejecute el siguiente comando, obtendrá el contenido de la carpeta HEAD en 07-03-2012.
svn cp <URL>/HEAD/ <URL>/branches/07-03-2012 -m "test"
Creo que lo que quieres es que el contenido del tronco termine en la carpeta /tags/version-1.0/
sin que haya una carpeta / trunk
adicional ahí. es decir, esto es malo: /tags/version-1.0/trunk/stuff
. Esto es bueno: /tags/version-1.0/stuff
.
Para obtener esto, hago un proceso de 2 pasos:
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
Estás muy, muy cerca:
svn copy -m"Copy Directory" file:///path/to/a_folder file:///path/to/another_folder
simplemente suelte el / *
del primer argumento.