Fuera del reloj voy a tratar de idear una estrategia para el control de versiones para mi empresa; actualmente usamos SVN pero no hay estructura, básicamente solo tenemos un enlace troncal y solo nos comprometemos a eso. Recientemente, el gerente de desarrollo comenzó un segundo repositorio que actúa como nuestra "etiqueta", pero debe fusionarse manualmente con el "tronco", ya que no es parte del mismo repositorio, sino uno completamente separado. En efecto, solo hay una carpeta, llamada "Dev" (en realidad hay diferentes carpetas "Dev" en diferentes fechas pero solo "Dev" es la principal) y debajo de eso está todo lo demás; Todos los demás proyectos. No está organizado por proyecto en absoluto, no tiene ningún concepto de ramas / etiquetas / troncales ni nada. La persona que lo configuró inicialmente (hace mucho tiempo, por supuesto) parecía no saber cómo configurar SVN en absoluto, y desde entonces nadie se ha molestado en aprender a hacer las cosas correctamente por miedo a romper algo. No usamos ningún tipo de CI (o pruebas automatizadas, desafortunadamente).
Primero, ¿deberíamos separarlo por proyecto? Por ejemplo, tenemos: dos sitios web ASP.NET (no aplicaciones web, sitios web), un servicio web, una carpeta de implementación para todos los scripts de tabla y procedimientos almacenados, dos clientes de línea de comandos para proyectos externos que son llamados por el Sitios web y una carpeta compartida que tiene objetos comerciales comunes y similares. Si cada uno de estos es su propio proyecto con una configuración de ramas / etiquetas / troncales, o debería ser así:
dev/
branches/
tags/
trunk/
Site1/
Site2/
WebService/
SharedCode/
y tiene todas las ramas y todo tiene una copia de la carpeta Dev completa? Ese enfoque podría ser más fácil de aceptar, ya que a menudo tenemos situaciones en las que necesitamos hacer cambios en la biblioteca de códigos compartidos y al menos uno (generalmente ambos) de los sitios web también.
En segundo lugar, hacemos lanzamientos regulares ("empuje" en nuestro lenguaje) a nuestro servidor de desarrollo y servidor en vivo. Por lo que he leído, la mejor manera de manejar esto sería que todo el desarrollo vaya al tronco /, las ramas son "temporales" y se usan para agregar una nueva característica que podría afectar el tronco, y las etiquetas son para lanzamientos. Entonces, presionamos cada mes, digamos, y estoy trabajando en un nuevo módulo. Yo bifurcaría el tronco y usaría esa rama para mi código, escribirlo y probarlo y lo que sea. Cuando el módulo esté terminado, lo fusionaría nuevamente en el tronco (y tal vez eliminaría la rama), y cuando estemos listos para implementar lo etiquetaríamos ("May2011", digamos). Si tenemos una corrección de errores después de que se active, se corregirá en la etiqueta de mayo de 2011 y se fusionará con el tronco (para que el tronco también obtenga la solución), y luego mayo2011 sería expulsado nuevamente con la solución? ¿Es esta la intención de etiquetar?
fuente
Respuestas:
Si desea un proceso de compilación unificado, asegúrese de colocar ramas / etiquetas / troncales en la raíz, de esta manera:
Si no necesita un proceso de compilación unificado, puede colocar ramas / etiquetas / troncales dentro de cada proyecto si lo desea. Sin embargo, puede ser difícil migrar a una compilación unificada después de haberlos colocado dentro de cada proyecto. Una compilación unificada tiene ventajas, como la eliminación de la necesidad de publicar componentes compartidos entre proyectos: todos son parte de la compilación.
Personalmente, me gusta un proceso de construcción unificado. Además, no creo que deba tener un proyecto "dev". Debería tener proyectos directamente debajo del tronco, y luego bifurcar el tronco en una rama de desarrollo. Use etiquetas para lanzamientos. Por ejemplo, lo haría así:
fuente
Sugeriría que si los proyectos están relacionados o comparten código, entonces quieren una troncal común. Si son independientes, entonces quieren troncales separadas o incluso repositorios separados. Si alguna vez necesita proporcionarle a un tercero una copia del historial de svn para un proyecto, entonces es mucho más fácil si está en un repositorio separado.
Entonces, en su caso, parece que el diseño que bosquejó anteriormente sería razonable, ya que ha compartido el código y desea que las ramas / etiquetas incluyan ese código compartido.
Personalmente, también agregaría la advertencia de que cualquier cosa comprometida con el tronco debe construirse, debe ser atómica y no debe romper ninguna prueba unitaria. Las ramas son para trabajos inacabados en progreso. Esperaría que la troncal sea un posible candidato de liberación en cualquier momento.
fuente
La siguiente es la mejor manera de diseñar un repositorio de Subversion
De esta manera, puede consultar proyectos individuales por sí mismos.
Si desea verificar los 3 proyectos y hacer una compilación unificada con un script / sistema de compilación monolítico, investigue utilizando un módulo maestro con svn: externos mapeando todos los otros proyectos en el maestro
trunk
.Esto es más complicado a primera vista, pero es la forma más fácil e idiomática de resolver este problema con Subversion.
fuente