2009-04-20 11 views
20

Esto puede ser imposible, pero voy a preguntar de todos modos.¿Cómo puedo hacer una única confirmación SVN a través de múltiples externos en la línea de comando?

Sin entrar en detalles sobre por qué es así, tengo dos cajas principales en las que trabajo, una para la rama de lanzamiento de producción y otra para el tronco. Cada uno de ellos es una pequeña colección de svn: referencias externas a subproyectos, sin contenido directo en el directorio svn check-out.

Es decir, las cuatro directivas svn: externals agregan todo el contenido en cada uno de los directorios de checkout.

Cuando realizo una confirmación a través de Eclipse (/ Subclipse) puedo realizar cambios en todos los proyectos externos de una sola vez, lo cual es bueno porque solo son subproyectos separados en el mismo repositorio y esto me permite evite hacer 4 commits por separado en el mismo repositorio.

¿No es posible hacer lo mismo desde la línea de comandos? Los commits para cada uno de los elementos externos sin duda podrían estar escritos con guiones y alias a un comando, pero prefiero evitar llenar el registro de commit con commits separados para los cambios relacionados si es posible.

Respuesta

7

Desafortunadamente, su suposición era correcta. La herramienta de línea de comandos de subversión actual no se repetirá en copias de trabajo externas inconexas durante una confirmación. Eclipse probablemente se da cuenta de que todo está enraizado de la misma manera y lo ajusta todo para que solo haga una única transacción de confirmación.

Este inconveniente del cliente se muestra realmente como uno de los temas a tener en cuenta al definir elementos externos en su proyecto. A partir del cliente 1.6.1, esta limitación aún existe.

9

Puede especificar todos los archivos y carpetas que desea confirmar en el cliente de línea de comandos, incluidos los externos. Dado que la CL no recursivo en lo externo, tiene que especificar los comandos de la confirmación en su forma separada:

svn ci working_copy externals1 externals2 -m "log message" 

no he probado esto, sin embargo. Si no funciona, debe especificar todos los archivos y carpetas modificados por separado, no solo las carpetas 'raíz' de los elementos externos.

+0

Desafortunadamente no puedo probar esto en mi configuración existente ya que dos de los externos falsifican un directorio principal común, así que recibo un error que dice que no es un directorio de trabajo (porque no lo es) cuando intento una solución como: svn ci htdocs/intra htdocs/update scripts includes -m "msg" –

+0

... y no hay cambios para confirmar en los scripts e incluye. –

+8

Sé que esto es anterior a la suciedad en este punto, pero lo anterior no funciona para rutas externas relativas (externas que pertenecen al mismo repositorio. Se obtiene "¿Todos los objetivos forman parte de la misma copia de trabajo? No se puede bloquear {externalPath } ".Sin embargo, funciona si hace rutas completas de archivos a cada archivo. – MightyE

-2

Usted puede hacer:

svn ci -m"my comment" * 
+0

amplíe su respuesta y explique por qué ese comando realiza la tarea – WebChemist

1

Si sólo tiene contenido y no hay modificaciones de atributos, que puede hacer algo por:

svn st | egrep "^M" | awk '{print $2}' | xargs svn ci -m 'your message' 

Si ha añadido/borrados, archivos ..., Puede modificar la expresión regular egrep para que se ajuste a sus necesidades.

0

que iterar sobre todas las cosas externas, y ejecutar "svn commit" en cada uno, tales como:

for dir in $(svn propget svn:externals . | awk '{print $2}'); do svn commit $dir; done 
2

Con la última SVN que puede hacer: --include-externals

Cuestiones relacionadas