2010-08-20 23 views

Respuesta

35

Con Subversion 1.5 o posterior, la fusión se registra en su copia de trabajo local en la propiedad svn: mergeinfo. Entonces esta información no se pierde.

Puede ver las revisiones fusionadas si usa svn log -g en lugar de svn log normal.

fusiones normales se realizan como

svn merge -rREV1:REV2 svn://server/branch my_trunk_wc 

Pero si se utiliza una rama a veces es más conveniente utilizar una combinación de reintegración. En este caso, primero debe combinar todos los cambios del tronco a la rama de usar algo como

svn merge svn://server/trunk my_branch_wc 

(Esto se combina todo lo que no esté ya fusionó)

Y después de confirmar este cambio a la rama que se puede utilizar

svn merge --reintegrate svn://server/branch my_trunk_wc 

Para mover todos los cambios como un compromiso único. (Después de esta operación debe quitar la rama)

+0

_ "después de esta operación, debe eliminar la rama" _. ¿Por qué, no debería simplemente ser "puede eliminar"? Me gusta mantener todo el historial siempre y cuando no cause ningún problema. – Zitrax

+1

El historial todavía está presente en la revisión anterior, como puede ver al ejecutar 'svn log -g'. Pero ya no deberías usar la rama ya que no se puede fusionar nuevamente sin más contabilidad. (Tenga en cuenta que versiones mucho más nuevas de Subversion (1.8+) omitieron el requisito de --reintegrate e incluso pueden hacer que la rama se pueda utilizar de nuevo con la combinación correcta del tronco) –

+0

@BertHuijben: Hola señor, ¿podría echar un vistazo a mi pregunta [aquí? ] (http://stackoverflow.com/q/36157555/3287204)? Gracias de antemano ... :) –

1

Puede guardar cada conjunto de cambios como un diff y luego asignar cada uno encima del tronco. Esto se conoce comúnmente como "trasplante", y hay varias herramientas para hacerlo automáticamente.

+2

¿Algún ejemplo de esas herramientas? – turbanoff

5

Estoy un poco oxidado con la fusión, pero ¿no debería eso hacer el truco?

svn merge -rREV1:REV2 svn://server/branch my_trunk_wc 

Ver:

svn merge --help 
+1

simplemente se fusionará en su copia de trabajo, que luego se comprometerá, pero el historial del trunk recordará solo este commit sin los de la rama –

+0

Creo que tiene razón ... Estaba confundiendo con 'copy' que conserva la historia. – DarkDust

+2

¿No es esto para lo que es 'svn: mergeinfo'? – detly

0

Parece que usted quiere:

  1. Combinar posiblemente de varias ramas.
  2. Haga que todas las fusiones se graben como tales.
  3. Confirmar como una nueva revisión solamente.

Creo que esto es compatible con la arquitectura SVN subyacente. Pero no sé si hay clientes que lo proporcionen (aunque svnmucc lo hará por múltiples comandos cp, mv, rm). A menos que quiera hacer más investigación de la que tengo (lo que no tomaría mucho), o escriba su propio cliente que pueda impulsar las bibliotecas SVN para que lo hagan (lo cual puede ser difícil pero posible); entonces creo que tendrás que sacrificar uno de 2. y 3. arriba.

(Si sacrificas 3 puedes volcar el repositorio inmediatamente después y hackear el archivo de volcado para usar una sola revisión, pero no creo que valga la pena el riesgo solo para tener un historial de revisión minuciosamente simple ...)

1

crear una combinación de una rama y crear una única confirmación para cada confirmación en la rama puede utilizar una secuencia de comandos, estoy usando la siguiente:

#/bin/bash 

BRANCH="http://your branch url" 

for i in {1127..1138} # list of revisions 
do 
    REV=$i 
    echo $REV $BRANCH 
    echo merged $REV from $BRANCH > tmps.commit 
    svn log -c $REV $BRANCH >> tmps.commit 
    svn up 
    svn merge -c $REV $BRANCH ./ 
    svn commit -F tmps.commit 
    rm tmps.commit 
done 

Esto verificará cada revisión que especifique para la rama específica y realizará una confirmación en el directorio actual, preservando así cada cambio individual con el mensaje correspondiente.

+0

Acabo de utilizar este script con éxito y funciona bien. La única consideración es que como esta secuencia de comandos recorre todos los números de revisión de X a N, no son números puramente consecutivos, podemos tener la revisión 1131 seguida de la revisión 1135, por ejemplo. En este caso, fusionaremos una confirmación de revisión en blanco en la nueva rama creando una confirmación sin cambios. Puedo modificar esta secuencia de comandos la próxima vez para verificar si tmps.commit está vacío y si es así 'continuar' para evitar estos cambios adicionales sin cambios. Como SVN no permite una confirmación sin un comentario, esto debería funcionar como se esperaba. – jcpennypincher

Cuestiones relacionadas