2010-03-29 11 views
5

Mi equipo usa SVN para control de fuente. Recientemente, he estado trabajando en una sucursal con fusiones ocasionales desde el maletero y ha sido una experiencia bastante molesta (véase Joel Spolsky's "Subversion Story #1"), así que he estado buscando formas alternativas de administrar sucursales y fusionarme. Dado que un repositorio SVN centralizado no es negociable, lo que me gustaría es un conjunto de herramientas que satisfagan las siguientes condiciones.Herramientas para mantener sucursales en SVN

  1. El historial completo de revisiones debe almacenarse en SVN para troncales y ramas.

  2. La fusión en cualquier dirección (y potencialmente entrecruzada) debería ser relativamente indolora.

  3. El historial de fusiones debe almacenarse en SVN en la mayor medida posible.

He mirado en tanto git-svn y bzr-svn y tampoco parece que hasta el trabajo — básicamente, dado el historial de revisiones que pueden exportar desde el repositorio SVN, que parece que no puede hacer nada mejor una fusión de manejo de trabajos que SVN puede. Por ejemplo, después de clonar el repositorio con git, el historial de revisión de mi rama muestra la rama original fuera de troncal, pero git no "ve" ninguna de las fusiones de SVN provisionales como fusiones "nativas" — el historial de revisiones es largo línea. Como resultado, cualquier intento de fusionarse desde el tronco en git generará tantos conflictos como lo haría una fusión de SVN. (Además, el git-svn documentation advierte explícitamente contra el uso de git fusionar entre las ramas.)

¿Hay una manera de ajustar mi flujo de trabajo para hacer git satisfacer los requisitos anteriores? Tal vez solo necesito consejos o trucos (¿o una herramienta de fusión separada?) Para ayudar a SVN a fusionarse mejor en sucursales.

+0

Parece que realmente necesitas convencer a tu equipo para que use git. : P – Amber

+2

Creo que, desafortunadamente, te encuentras con el hecho de que SVN simplemente tiene una capacidad limitada para fusionar sucursales, y siempre que tu repositorio central sea un repositorio SVN, es difícil para cualquier cantidad de magia git salvarte. Sin embargo, estoy curioso de ver si hay buenos kludges de trabajo. – Cascabel

Respuesta

2

Sin tener una respuesta SVN pura, me gustaría hacer referencia a la cuestión SO "How to fool git-svn to recognize merges made with svn?"

me recomienda hacer los git se funde en una rama especial, pero una solución más sencilla sería la de grabar (al menos la más) SVN reciente funde en el git-svn repo clonado con git grafts file, con el fin de transformar:

o-...-A---o---D--- unstable 
/  
X-----B---M---o---o--- stable 

en:

o-...-A---o---D--- unstable 
/  \ 
X-----B---M---o---o--- stable 

, facilitando el proceso de fusión de git, antes de comprometer y enviarlo de regreso a SVN.

+0

El archivo de injertos parece ayudar mucho, ¡gracias! Parece suficiente agregar un injerto para la última fusión del tronco. ¿Está bien? ¿Recomiendas usar 'git merge --squash' para ocultar el verdadero DAG de SVN? Además, me pregunto qué tan bien satisface el n. ° 3 (aunque, sinceramente, no estoy seguro de cuán valioso es tener mergeinfo para SVN). –

+0

@Chris: después de leer http://stackoverflow.com/questions/2427238/in-git-what-is-the-difference-between-merge-squash-and-rebase, no creo que una 'fusión squash' es necesario aquí. SVN puede usar el DAG para grabar algunos metadatos 'mergeinfo' durante' dcommit'. – VonC

Cuestiones relacionadas