SVN cómo resolver nuevos conflictos de árboles cuando se agrega un archivo en dos ramas

95

Al fusionar un par de ramas (usando SVN 1.6.1) donde se ha agregado un archivo en ambas ramas (y luego se trabajó en esas ramas separadas), obtengo uno de los nuevos conflictos de árbol:

      C foo.txt
  >   local obstruction, incoming add upon merge

Necesito los cambios de ambas ramas, pero el conflicto del árbol no me da los archivos habituales .working, .merge-left y .merge-right, lo cual es comprensible debido a la naturaleza del conflicto. Hay bastantes de estos conflictos, y algunos en los que se ha eliminado el mismo archivo en cada rama, pero son fáciles de resolver.

¿Cómo puedo resolver este problema? El libro de frijoles rojos de SVN (para 1.6) no cubre esta situación.

Desfusión
fuente

Respuestas:

40

Como se mencionó en una versión anterior (2009) del documento de diseño "Tree Conflict" :

Conflicto XFAIL de la combinación de agregar sobre archivo versionado

Esta prueba realiza una combinación que trae una adición de archivo sin historial a un archivo versionado existente .
Esto debería ser un conflicto de árbol en el archivo de la local obstruction, incoming add upon mergevariedad ' '. Expectativas fijas en r35341.

(Por cierto, esto también se llama "gemelos malvados" en ClearCase):
un archivo se crea dos veces (aquí se "agrega" dos veces) en dos ramas diferentes, creando dos historias diferentes para dos elementos diferentes, pero con el mismo nombre.

La solución teórica es fusionar manualmente esos archivos (con una herramienta de diferenciación externa) en la rama de destino ' B2'.

Si todavía está trabajando en la rama de origen, el escenario ideal sería eliminar ese archivo de la rama de origen B1, fusionar de nuevo de B2a B1para que ese archivo sea visible en B1(luego trabajará en el mismo elemento).
Si no es posible una fusión hacia atrás porque las fusiones solo ocurren de B1a B2, entonces será necesaria una fusión manual para cada B1->B2fusión.

VonC
fuente
2
El documento de diseño de "conflicto de árbol" tiene un enlace podrido :(
whitey04
4
Lo curioso es que incluso si ambos archivos agregados son idénticos , siguen apareciendo como conflictivos. Esto realmente no debería marcarse como un conflicto.
SantiBailors
1
@SantiBailors Qué gracioso que me estoy muriendo ahora mismo. Morir por mi viejo amigo git ...
Invierno
163

Encontré una publicación que sugiere una solución para eso . Está a punto de ejecutarse:

svn resolve --accept working <YourPath>

que reclamará los archivos de la versión local como correctos.
Puede ejecutarlo para catálogos de un solo archivo o de proyectos completos.

lukmdo
fuente
2
Gracias, esto también resuelve: C foo.txt> agregar local, agregar entrante al actualizar
lazysoundsystem
5
gracias, también funcionó para mí, pero tuve que hacer esto: svn resolve --accept working FILENAME
ajacian81
5
sí, necesitas un nombre de archivo. Acepta '.' (el directorio actual). También necesitaba hacer esto de forma recursiva, así que: "svn resolve --accept working --recursive". resuelve todo a favor de su copia de trabajo (¡peligroso! Es posible que esté borrando los cambios de otras personas cuando hace esto, como siempre cuando resuelve conflictos)
Harry Wood
Utilizo un alias que he creado para enumerar todos los archivos en conflicto de árboles: alias mtc='stat | awk "BEGIN { FS=\" \" } /^.{6}C/ { print \$NF }"' luego puedo usar esto como argumento para el comando de resolución, así: svn resolve --accept working $(mtc)
Earl Jenkins
1
De hecho, debe especificar también el recurso, por ejemplo: svn resolve --accept working path/index.html
Tomasz Kuter
9

¿Qué pasa si los cambios entrantes son los que desea? No puedo ejecutar svn resolve --accept their-full

svn resolve --accept base

Gabriel FT Gomes
fuente
4
Creo que he entendido mal la pregunta. 'base' es, de hecho, equivalente a 'theirs-full' cuando se usa 'svn resolve' pero no resuelve su problema. Lo que hice en su lugar fue dividirlo en dos partes: 1) Eliminar mi directorio (o archivo) local en conflicto, 2) Combinar. Esto debería ejecutarse sin conflictos, y dado que 'los cambios entrantes son los que desea', no me importarían los elementos eliminados
Gabriel FT Gomes
3

Me las arreglé para encajarme bastante a fondo tratando de seguir el consejo de user619330 anterior. La situación era: (1): había agregado algunos archivos mientras trabajaba en mi rama inicial, branch1; (2) Creé una nueva rama, branch2 para un mayor desarrollo, bifurcándola desde el tronco y luego fusionando mis cambios de branch1 (3) Un compañero de trabajo había copiado mis mods de branch1 a su propia rama, agregó más modificaciones, y luego se fusionó de nuevo con el tronco; (4) Ahora quería fusionar los últimos cambios del tronco en mi rama de trabajo actual, branch2. Esto es con svn 1.6.17.

La fusión tenía conflictos de árbol con los nuevos archivos, y quería la nueva versión del tronco donde diferían, así que de una copia limpia de branch2, hice una eliminación de svn de los archivos en conflicto, cometí estos cambios de branch2 (creando así un temporal versión de branch2 sin los archivos en cuestión), y luego hice mi fusión desde el tronco. Hice esto porque quería que el historial coincidiera con la versión del tronco para no tener más problemas más adelante al intentar fusionarme con el tronco. La fusión fue bien, obtuve la versión del tronco de los archivos, svn st muestra todo bien, y luego llegué a más conflictos de árbol mientras intentaba confirmar los cambios, entre la eliminación que había hecho antes y la adición de la combinación. Hice un svn que resolviera los conflictos a favor de mi copia de trabajo (que ahora tenía la versión troncal de los archivos), y logré que se comprometiera.

Bueno no. Una actualización de otra copia de branch2 resultó en la versión anterior de los archivos (fusión previa al tronco). Así que ahora tengo dos copias de trabajo diferentes de branch2, supuestamente actualizadas a la misma versión, con dos versiones diferentes de los archivos, ¡y ambas insisten en que están completamente actualizadas! Verificar una copia limpia de branch2 resultó en la versión anterior (anterior al tronco) de los archivos. Los actualizo manualmente a la versión del tronco y confirmo los cambios, vuelvo a mi primera copia de trabajo (desde la que había enviado los cambios del tronco originalmente), trato de actualizarlo y ahora obtengo un error de suma de comprobación en los archivos en cuestión. Elimine el directorio en cuestión, obtenga una nueva versión a través de la actualización, y finalmente tengo lo que debería ser una buena versión de branch2 con los cambios en el tronco. Espero. Desarrollador de advertencia.

dewtell
fuente