2010-09-29 22 views
14

¿Esto es un desagradable error de Subversion o me estoy acercando de la manera incorrecta?Subversion: Merge, Revert, Merge nuevamente. ¿Por qué falla silenciosamente?

Fusiona una rama en un tronco. -> HelloWorld.txt actualizaciones

Revert HelloWorld.txt

hacer lo mismo de mezcla de nuevo. -> Sin archivos actualizados.

¿Por qué la segunda fusión no actualiza HelloWorld nuevamente? Está actuando como si ese cambio ya hubiera sido copiado. ¿No debería el revertir reiniciarlo?

Si revierte toda la carpeta en la que se encuentra HelloWorld, la segunda fusión aplica correctamente el cambio nuevamente. Solo si revierte un archivo, falla.

Esto da un poco de miedo. ¿Qué ocurre si necesito revertir algunos archivos por el momento? Cualquier fusión futura silenciosamente no podrá copiar el código crítico.

Subversion 1.6 OS X 10.6.4

+0

¡Gracias a todos los que respondieron! – Stephen

+0

Iba a hacer la misma pregunta. Tenga en cuenta que esto también ocurre si permanece en el enlace troncal, edita en r42, retrocede en r43 y desea volver a aplicar r42. Debe ignorar el ancestro, de lo contrario, no se hace nada. – rds

Respuesta

6

realiza Subversion registro de fusiones, lo que significa que va a grabar lo que las revisiones ya se han fusionado. La información de fusión se registra en una propiedad llamada svn:mergeinfo en la raíz de la combinación (es decir, cualquiera que haya ingresado como destino después de svn merge). Ha revertido el archivo, pero probablemente no ha revertido la raíz de combinación que contiene la propiedad svn:mergeinfo modificada o agregada.

3

Sanders tiene razón.

No crea que está copiando estados. Usted "toma" los cambios y los aplica de nuevo en un objetivo diferente (que idealmente es un relativo al origen de la fusión).

Antes de svn 1.5 teníamos que hacer un seguimiento de los cambios manualmente al fusionarnos. "Uhm hizo combino r28445 a r28501 de esta rama no quiero volver a aplicar los cambios que hice allready: -? /"

Era un dolor de cabeza-máquina;)

svn desde 1,5 comprueba lo que lo hizo en el pasado y solo aplicará el mismo cambio histórico una vez a un destino único.

Debería poder deshabilitar esta comprobación amistosa usando "--ignore-ancestry" en su comando de combinación de svn. Prepárese para recibir MUCHOS cambios en los que ya aplicó. Reduzca lo que quiere obtener al establecer la revisión.

svn merge --ignore-ancestry -c REVISION_WITH_CHANGE http://mysvn/path/to/mergeorigin 
19

Este comportamiento se documenta en la sección de documentación de SVN Advanced Merging (ver nota 23). Cuando fusiona su cambio por primera vez, se rastrea el número de revisión fusionada en la propiedad svn:mergeinfo. Si deshace los cambios, la revisión aún se marca como fusionada, para evitar que se vuelva a fusionar por error. El hecho es que si lo eliminó, hay pocas posibilidades de que lo desee de nuevo ...

Sin embargo, si realmente desea fusionarlo de nuevo, puede usar la opción --ignore-ancestry que no se activará en svn:mergeinfo si la revisión sido fusionada previamente. Otra solución es eliminar deliberadamente esta revisión del svn:mergeinfo, para que pueda fusionarse nuevamente en el futuro. Pero no lo haga a mano, use la opción --record-only del comando svn merge para eso.

+0

Sucedió sobre esto y estoy feliz de entender lo que significa "ignorar ancestros". ¡Ojalá lo hubieran llamado "ignorar mergeinfo" en su lugar! –

+0

¡Te pagaré una cerveza! – juanmf