2010-11-22 18 views
6

Tenemos varios repositorios de subversión: uno para código común y uno para cada proyecto de nivel superior. Los proyectos de nivel superior tienen un svn: enlace externo al tronco del repositorio común.Cómo actualizar Subversion externos

Antes de crear una versión de un proyecto, creamos una rama del proyecto de nivel superior y también creamos una rama paralela en el repositorio común.

¿Cómo podemos asegurar automáticamente que la propiedad svn: external en el proyecto de nivel superior ramificado apunta a la rama paralela en el directorio común? En este momento estará apuntando a "trunk" en el repositorio común. Actualmente tenemos que editar esto manualmente en el proyecto ramificado.

Gracias

Respuesta

6

Si le entiendo, usted quiere asegurarse de que foo y bar comparten la misma rama. foo es su proyecto maestro y tiene un svn:externals en el que apunta a bar. Cuando ramas foo, quiere asegurarse de que bar esté utilizando la misma rama. La única manera de garantizar eso es crear su repositorio con los directorios tags y branches en la raíz de su repositorio en lugar de en la raíz del proyecto (como la mayoría de los sitios lo hacen).

Luego puede usar referencias externas relativas para apuntar desde el directorio foo que contiene el svn:external de vuelta a bar. También, si etiquetas foo y bar con la misma etiqueta, foo y bar mantendrá su relación:

$ svn propset svn:externals ../../bar common 

Si sus ramas estaban en la raíz de su repositorio, entonces el directorio common estará apuntando a la misma rama para foo como está en bar.

El gran problema con snv:externals es que si no tiene cuidado, apunta a una versión siempre cambiante del directorio al que se está vinculando. Digamos que alguien hizo esto:

$ svn propset svn:externals /projects/bar/trunk common 

en mi proyecto foo. Hago un lanzamiento y copio foo en una etiqueta. Sin embargo, el directorio common que he etiquetado se modificará cuando alguien actualice bar/trunk. Esto hace que sea casi imposible reconstruir foo.

Cuando uso svn:externals, siempre me aseguro de estar enlazando a una versión etiquetada de bar, o una revisión específica, y si estoy enlazando a una revisión específica, también pego mi URL a esa revisión en caso alguien decide eliminar el directorio que estoy vinculando a mi propiedad svn:externals.

No hay nada en Subversion que actualizará automáticamente sus svn:externals propiedades, pero se puede buscar todas svn: externos en un árbol de directorios utilizando

$svn propget -v -R svn:externals . 

he encontrado que svn:externals por lo general termina siendo una más grande dolor de lo que vale

En su lugar, simplemente guardo el objeto construido de bar o una copia comprimida de la fuente en mi repositorio de versiones, y como parte de mi procedimiento de compilación, copio el objeto o fuente comprimida de mi repositorio de versiones.

Uso repositorios de sitios de Maven como Nexus o Artifactory como mi repositorio de versiones, incluso si no estoy haciendo un proyecto Maven o incluso trabajando en un proyecto basado en Java. El repositorio local de Maven proporciona todas las herramientas que necesita para cargar y descargar sus paquetes dependientes, además Maven tiene el concepto de , repositorio de liberación, donde el código nunca cambia, y un repositorio de instantánea, donde planea liberar el código, pero podría cambiar. Esto es útil si sospecha que bar podría cambiar debido a las cosas que necesita en foo.

+0

Gracias por los útiles comentarios. Sin embargo, no pudimos reorganizar nuestros repositorios, por lo que escribimos un archivo por lotes que se ejecuta cuando deseamos realizar una publicación. El archivo de proceso por lotes realiza la bifurcación y actualiza el svn: externals para apuntar a la bifurcación paralela en el repositorio común. –

Cuestiones relacionadas