2009-04-29 12 views
8

Al realizar una fusión con Mercurial, quiere fusionar los archivos conflictivos de uno en uno, lo que no es un flujo de trabajo productivo en los grandes conjuntos de fusión. En cambio, lo que me gustaría hacer es fusionar todos los conjuntos de cambios de ambas cabezas (como usar kdiff3 a diff 2 cabezas). Para mí eso suena sencillo, pero no puedo entender cómo lograrlo.¿Cómo puedo hacer una fusión basada en conjuntos de cambios en lugar de fusión basada en archivo por archivo con Mercurial?

Hasta ahora, lo más cerca que puedo llegar es pasar por la fusión de la manera habitual, dejar todos los conflictos sin resolver (un archivo a la vez ...), y luego hg vdiff -rHead1 -rHead2 - pero vdiff (usando kdiff3) doesn ' Parece que tiene opciones para pasarle a la herramienta un directorio de salida (el directorio de trabajo actual) y en su lugar se inicia con el directorio de salida como un tempdir (posiblemente -o es la respuesta?).

Déjenme decirlo de otra manera: quiero usar kdiff para unir dos cabezas en mi directorio de trabajo. Quiero que los resultados en mi directorio de trabajo sean mi fusión que pueda comprometer.

Me falta algo obvio, no puedo ser el único que quiera hacer esto.

+0

Estaba un poco confundido por el fraseo de la pregunta. Los conjuntos de cambios en Mercurial son piezas inmutables de la historia; aquí IIUC desea fusionar un árbol completo de archivos a la vez en lugar de archivo por archivo. –

Respuesta

0

Intenta configurar ui.merge. Ver this page para más detalles.

+0

tal vez mi pregunta no sea lo suficientemente clara: independientemente de la configuración de ui.merge, aún obtendré una fusión de archivo a la vez de mercurial, en lugar de una combinación completa de conjuntos de cambios frente a conjuntos de cambios (a menos que me falte algo?) – jsaylor

+0

Todavía estoy un poco confundido, ¿no necesitarías kdiff para mostrarte archivos en conflicto de a uno por vez? ¿O puede resolver todos tus conflictos sin intervención manual? –

1

Creo que this responde a tu pregunta.

+0

Buen artículo, pero sigo buscando unir cabezas (no conjuntos de cambios en la mitad de la rama). Mi pregunta no fue del todo clara en este punto. – jsaylor

3

Transmití la pregunta al #mercurial en irc.freenode.net hace un par de días. mpm (el autor de Mercurial) dio una especie de respuesta (era solo la mitad de una respuesta, así que no la pasé inmediatamente). Dijo que uno podría hacer algo en donde permites que Mercurial fusione los archivos automáticamente (e inserte los marcadores de fusión <<<< y >>>> donde haya conflictos).

Luego use una herramienta de combinación que tenga conocimiento de estos marcadores: esto le permitirá resolverlos todos a la vez en lugar de hacerlo archivo por archivo. Un punto de partida sería la página en merge tool configuration. Explica que

 
[ui] 
merge = internal:merge 

hará que Mercurial inserte los marcadores de fusión. Aquí lo probé haciendo dos archivos x.txt y y.txt que luego modifiqué con cambios conflictivos en dos clones. La fusión dio simplemente:

 
% hg merge 
merging x.txt 
warning: conflicts during merge. 
merging x.txt failed! 
merging y.txt 
warning: conflicts during merge. 
merging y.txt failed! 
0 files updated, 0 files merged, 0 files removed, 2 files unresolved 
use 'hg resolve' to retry unresolved file merges or 'hg up --clean' to abandon 

Todos los archivos fueron procesados ​​en una sola vez, no tenía nada que confirmar por archivo como usted describe.

Los archivos contienen ahora combinar los marcadores de esta manera:

% cat x.txt 
foo 
<<<<<<< local 
hehe 
======= 
foobar 
>>>>>>> other 

El siguiente paso es encontrar una herramienta que puede tomar un árbol de directorios con este tipo de archivos y dejar a resolverlos. Miré kdiff3, pero no encontré la manera de usarlo para operar solo en un archivo, parece muy centrado en comparar pares de archivos/directorios.

No estoy seguro de cuánto te ayuda esta media respuesta, ¿quizás también te has quedado atascado en este punto? Pero espero que pueda ayudar a otros que deseen insertar los marcadores de fusión en todos los archivos y luego resolver los conflictos a mano.

+0

Estabas cerca de la idea de dejar que los archivos no resueltos se quedaran. Creo que se me ocurrió una respuesta más completa, pero utilizando esta estrategia, que acabo de publicar aquí. – jsaylor

+0

Estoy muy contento de que al menos hayas encontrado la manera de lograrlo, aunque no sea una manera perfecta. Se podría hacer una extensión para hacer que el trabajo fluya mejor, pero hago tan pocas combinaciones que no voy a escribirlo :-) –

0

suena como desea que el comando extdiff:

tengo estos en mi ~ /.hgrc (prefiero MELD, pero usted puede cambiarlo a kdiff3, etc)

[extensions] 
hgext.extdiff = 

[extdiff] 
# add new command called meld, runs meld (no need to name twice) 
cmd.meld = 

Con extdiff sus fusiones se producen en el directorio de trabajo, y por otra parte se puede pasar ningún parámetro adicional a su programa de diferenciación con -o:

$ hg help extdiff 

hg extdiff [OPT] ... [ARCHIVO] ...

uso programa externo para ver las diferencias repositorio (o archivos seleccionados)

Show differences between revisions for the specified files, using 
an external program. The default program used is diff, with 
default options "-Npru". 

To select a different program, use the -p option. The program 
will be passed the names of two directories to compare. To pass 
additional options to the program, use the -o option. These will 
be passed before the names of the directories to compare. 

When two revision arguments are given, then changes are 
shown between those revisions. If only one revision is 
specified then that revision is compared to the working 
directory, and, when no revisions are specified, the 
working directory files are compared to its parent. 

opciones:

-p --program programa de comparación para ejecutar la opción de pase
-o --option al programa de comparación
-r --rev revisión
-I --include incluye nombres coincidir los patrones dados
-X --exclude excluir nombres que coinciden con los patrones dados

+0

Mi problema es que sigue siendo archivo por archivo, y no me da un conjunto de cambios completo frente al enfoque de fusión de conjuntos de cambios. – jsaylor

4

me ocurrió una solución que logra lo que quiero, pero todavía me siento como si fuera un kludge

  • Comience con un directorio de trabajo vacío con 2 cabezas: Mine and Theirs.
  • actualización de trabajo dir a la mina:
    hg update [My head's rev here]
  • realizar una combinación, pero fallan todos los archivos que Merc no puede manejar de forma automática sin necesidad de iniciar una herramienta de combinación y mantener "Mis" archivos cuando están en conflicto:
    hg --config "ui.merge=internal:fail" merge

Consulte https://www.mercurial-scm.org/wiki/TipsAndTricks#head-9f405488b6d3b3d092a09aafa28db515ba44c742 para obtener información sobre cómo fusionar o fallar.

Ahora tengo un directorio en funcionamiento con todo lo que el auto podría descifrar, pero los archivos pendientes aún no han sido modificados desde Mine. (Uso -l hg resolver para ver el estado de la resolución del mercurial de archivos actuales)

  • Ahora puedo Vdiff mi directorio de trabajo contra la cabeza suya que me da el alto nivel, merge-conjunto de cambios al conjunto de cambios que yo estaba buscando para.

hg vdiff -r [Theirs head's rev here]

Nota: Si está utilizando WinMerge para sus vdiffs, a continuación, asegúrese de que tiene un conmutador/r como una opción que hará un subdirectorio comparar y - si WinMerge de configuración se establece para utilizar Tree-View: brindará una excelente comparación de árboles. De Mercurial.ini:

[extdiff]
cmd.vdiff = C:\Program Files\WinMerge\WinMergeU.exe
opts.vdiff = /e /ub /r /dl other /dr local

Ahora puede trabajar en todo el directorio que incluye los archivos sin resolver y hacer cambios en todo el proyecto, según sea necesario (. Es decir, puede que la resolución de un archivo requiere cambios adicionales en otra).

  • Cuando termine, use resolver para marcar todos los archivos resueltos para Merc y luego confirmar.
    hg resolve -m

Uf! ¡Aquí está la esperanza de que esto ayude a otra persona!

+0

Parece una solución perfecta aunque de hecho kludgy :) Debes aceptarla como tu propia respuesta. –

+0

(Bump) Ahora, acepta esta respuesta ... –

Cuestiones relacionadas