2008-11-04 27 views
21

vía línea de comando, que suelo hacer esto:En SVN, ¿cómo copio solo los subdirectorios de un directorio a otro?

cp -rRp /path/to/a\_folder/. /path/to/another\_folder 

Esto copia sólo los contenidos debajo a_folder a another_folder. En SVN tengo que hacer lo mismo, pero no puedo resolverlo. 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 

Se dice que no existe.

EDIT:

Esto probablemente ayudaría. La estructura de directorios para mi proyecto es el siguiente:

my_project 
    /branches 
    /tags 
    /trunk 
    /vendor 
    /1.1 

que necesito para obtener el contenido de 1.1 en proveedor en el maletero sin que en realidad copiar la carpeta 1.1.

Respuesta

8

¿Ha considerado usar la combinación de svn?

dado una cesión temporal de esta manera:

trunk/a_folder/foo 
trunk/a_folder/bar 
trunk/new_folder/baz 

utilizar estos comandos para fusionar los foo y bar directorios:

cd trunk/new_folder 
svn merge -r1:HEAD http://svn/repo/trunk/a_folder . 
1

Eres muy, muy cerca:

svn copy -m"Copy Directory" file:///path/to/a_folder file:///path/to/another_folder 

simplemente suelte /* desde el primer argumento.

19

Como has descubierto, sin duda, copiar en un directorio de destino que ya existe no funcionará:

svn cp svn://my_project/vendor/1.1 svn://my_project/trunk

porque tronco ya existe, por lo que iba a terminar con:

Usando merge 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 combinación. Puede que no te importe. En este caso de combinación 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 fusión es la siguiente: En primer lugar determinar los cambios necesarios para hacer trunk idéntica a vendor/1.1, a continuación, aplicar los cambios en la copia de trabajo dado (también de tronco, en este caso).

Debo señalar que esta combinación efectivamente eliminará todo lo que estaba en el maletero anteriormente. Por lo tanto, si ya tiene modificaciones locales (no vendidas) en el enlace troncal, querrá aplicar solo los cambios entre 1.1 y el anterior hito de proveedor:

 
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 existe tronco, pero está vacía usted tiene dos opciones: reemplazar el tronco, o escribir un pequeño bucle de shell:

Sustitución del tronco se parece a esto:

 
svn rm svn://my_project/trunk 
svn cp svn://my_project/vendor/1.1 svn://my_project/trunk 

Aprovechando la cáscara (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 
3

Creo que lo que usted desea es que el contenido de la troncal termine en la carpeta /tags/version-1.0/ sin que exista una carpeta adicional /trunk allí. 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 
5

Este enlace explica una solución.

http://svn.haxx.se/users/archive-2004-12/1537.shtml

Básicamente lo que dice es que si la carpeta de destino no es existente en el repositorio, obtendrá los contencts de su carpeta de origen en la carpeta de destino.

Vea el ejemplo a continuación. La carpeta 07-03-2012 no existe en su repositorio. Una vez que ejecute el siguiente comando, obtendrá los contenidos de la carpeta HEAD en 07-03-2012.

svn cp <URL>/HEAD/ <URL>/branches/07-03-2012 -m "test" 
Cuestiones relacionadas