2010-10-27 11 views
6

Tengo un repositorio Mercurial con cuatro ramas en él. Una es la rama "común", las otras tres son ramas "específicas" que consisten en algunos cambios cosméticos aplicados a la rama común. Uno de esos cambios cosméticos consistió en cambiar el nombre de algunos archivos.Mercurial: ¿cómo fusionar los cambios en un archivo que se renombró en la otra rama?

Así que la rama común tiene "archivo.txt", y la primera rama específica tiene "archivo-01.txt" que es el mismo archivo, usado para el mismo propósito pero tiene un nombre diferente y contenido ligeramente diferente . Se renombró a file-01.txt en la rama específica, y "hg log -f file-01.txt" muestra correctamente el historial que se remonta a antes del cambio de nombre.

Cuando realizo un cambio en file.txt en la rama común, necesito poder combinar ese cambio en file-01.txt en la rama específica. Pero Mercurial no entiende que los archivos son iguales.

cambiada a distancia archivo.txt, que elimina locales

uso (c) colgado versión o dejar (d) eleted: Me dice?

Si elijo "c" entonces obtengo un nuevo archivo.txt que contiene exactamente lo que está en la versión de la rama común. Si selecciono "d", el cambio no se fusionará en absoluto.

¿Qué puedo hacer para hacerlo bien?


EDIT: Puedo hacer que funcione correctamente en un repositorio de prueba nuevo, pero no en mi repositorio real. Esto es lo que me pasa (nota que rev 118 es en la rama específica, justo antes del cambio de nombre original, por lo que estoy pasando por el proceso de cambio de nombre de nuevo para ilustrar):

C: update \ ...> hg -C 118

0 archivos actualizados, 0 archivos fusionados, 0 archivos eliminados, 0 archivos sin resolver

C: \ ...> hg funden por defecto

fusionan anotherfile.txt archivo.txt
fusión
0 actualización de archivos d, 2 archivos fusionados, 0 archivos eliminado, 0 archivos sin resolver
(fusión rama, no se olvide de cometer)

por lo que funciona sin el cambio de nombre. Pero si puedo cambiar el nombre, falla:

C: \ ...> hg update -C 118

2 archivos actualizados, 0 archivos fusionados, 0 archivos eliminados, 0 archivos resueltos

C : \ ...> hg cambiar el nombre de archivo archivo.txt-01.txt
C: \ ...> hg commit -m "a llamarse"

creados nuevo jefe

C: \ ...> hg merge default

archivo de cambio remoto.txt que local borró
uso (c) colgado versión o dejar (d) elegido?


EDIT 2: Esto es lo que me dan en el último paso de hg merge --debug default:

la búsqueda de copias de nuevo a 115 rev
archivos sin igual en locales:
archivo-01.txt
todas las copias encontradas (* = para combinar,! = Divergente):
file-01.txt -> file.txt

comprobación de directorio cambia el nombre
manifiestos resolver
sobrescritura Ninguno parcial False
antepasado 9d979018c2df f842fdbc252b + local 05fc75e480da remoto
anotherfile.txt: versiones difieren -> m
archivo.txt cambiado a distancia que locales suprime
uso (c) colgaron la versión o se fueron (d) elegidos?

+0

Esto es extraño ya que Mercurial normalmente sabe cómo combinar los cambios en el archivo renombrado. Aquí hay un ejemplo trabajado que puede intentar verificar: http://mercurial.aragost.com/kick-start/tasks.html#merging-default-into-a-branch No sé qué pasó en su caso , aunque. –

Respuesta

0

Terminé rastreando el problema hasta una revisión en particular en el historial: podía fusionar el cambio de nombre siempre que esa revisión no estuviera involucrada. Aún no estoy seguro de qué fue lo que salió mal con esa revisión, pero rehice los cambios y está funcionando ahora.

0

El problema está en cómo manejó el cambio de nombre en la rama. Desde su aspecto, usted (o su GUI) hizo una 'eliminación' en el antiguo nombre, archivo.txt, y luego hizo una adición de una copia de ese archivo llamado archivo-01.txt.

Cuando lo haces de esa manera, mercurial no tiene idea de que están vinculados. Sin embargo, si usted tenía, en la rama, se usa el comando:

hg rename file.txt file-01.txt 

continuación, en lugar del mensaje que se está viendo los cambios de archivo.txt se aplicaría a presentar-01.txt. Sin embargo, sin tu ayuda, Mercurial no puede saber que están vinculados.

+1

"entregó" -> "manejó"? –

+1

No sé lo que está mal, pero dice 'hg log -f file-01.txt' sigue correctamente el historial a través del * rename * ... que me hace creer que lo cambió de nombre correctamente. –

+0

Sí, supongo que fue renombrado en la GUI del navegador de archivos y luego obtuve el complemento/eliminación de un IDE. Si estoy equivocado, entonces definitivamente es algo más profundo, pero mi suposición es que 'hg rename' no se usó. Es cierto que es una corazonada. –

Cuestiones relacionadas