2009-02-25 12 views
50

He encontrado git mergetool para ser una utilidad práctica para unir diffs visualmente, pero la forma en que voy parece realmente poco convincente. En esencia, mi proceso tiene este aspecto cuando se reportan conflictos:Fusionando con "git mergetool"

  1. ejecutar un mergetool git
  2. En el indicador, golpeado Introduzca a lanzar mi herramienta de diferencias (Meld o FileMerge, dependiendo de la computadora)
  3. resolver los conflictos
  4. Guardar los cambios
  5. Cierre la herramienta de diferencias

Si tengo más de un conflicto, enjuague, repita. Sí, ese soy yo abriendo y cerrando mi visor de diferencias una vez por cada conflicto en la fusión. Desde que se lanzó desde la línea de comandos, cerrarlo es la única forma que conozco de decirle a git mergetool que he resuelto este conflicto en particular y que puede pasar al siguiente.

Seguramente hay una mejor manera, pero no tengo ni idea. Li'l ayuda, por favor? Este proceso parece loco ineficiente.

+6

También puede ejecutar 'git mergetool -y' para omitir las indicaciones intermedias. Es posible que aún tenga que cerrar la herramienta de combinación, pero no tendrá que regresar a la terminal y presionar regresar para cada combinación nueva. – moeffju

+1

Si está haciendo una fusión de varios archivos y esto es todo de lo que tiene que preocuparse, no tiene de qué preocuparse. – jwg

+0

@moeffju esta es la mejor respuesta para acelerar el proceso de fusión de conflictos. – mqklin

Respuesta

34

A primera vista, no parece posible reutilizar una sesión de herramienta de diferencia externa.

El git-mergetool documentation establece claramente:

Si la herramienta de combinación personalizada indica correctamente el éxito de una resolución de combinación con su código de salida, entonces la variable de configuración mergetool.<tool>.trustExitCode se establece en true.
De lo contrario, git-mergetool indicará al usuario que indique el éxito de la resolución después de que la herramienta personalizada haya salido.

Por lo tanto se necesita el código de salida (o la validación del usuario después de la salida de la herramienta de diferencias), lo que implica que el usuario cierre primero la herramienta de diferencias externo.

Eso parece un gran incentivo para reducir el número de conflictos en cada combinación/rebase uno intentos;) (cualquiera que sea la herramienta VCScs utiliza)

Nota:
otros dos ajustes herramientas git diff externo ("Setting up diff and merge tools for Git on Windows" y "Setting up SourceGear DiffMerge with Git") no dan más esperanzas cuando se trata de no cerrar la herramienta externa de diferenciar ...

+1

Cierto. :-) Gracias por el control de cordura. ¿Qué están usando usted y otros para hacer fusiones? ¿Simplemente abriendo archivos en su editor de elección? –

+0

Uso WinMerge en Windows, pero tengo que cerrarlo después de cada resolución como lo hace. – VonC

12

el problema para mergetool es que deliberadamente utiliza una interfaz de línea de comandos para iniciar una sesión de mezcla y luego espera para que el comando invocado regrese para determinar cuándo el usuario fusión impulsada ha completado.

La mayoría de las herramientas de combinación no proporcionan un mecanismo de línea de comando para iniciar una sesión de fusión en un proceso ya en ejecución con una forma de determinar cuándo se ha completado la resolución y si fue exitosa o no.

Es concebible que algunas herramientas de combinación puedan proporcionar esta funcionalidad a través de un comando de contenedor separado y algún tipo de IPC, pero sería excesivamente específico de la herramienta y difícil de implementar en el programa genérico mergetool.

+1

Estoy de acuerdo con este análisis. +1 – VonC

+0

Git podría determinar el "estado de éxito de fusión" en función de si el objetivo de fusión se actualizó (cambió). Entonces, si "guardo la fusión", implica que completé con éxito. De lo contrario, no lo hizo. Pero tal vez se necesite una fusión en dos etapas para este caso de uso. – phord

+0

@phord: Hace esto para las herramientas que no informan un estado a través de sus valores de retorno, pero eso no ayuda en este caso, ya que todavía no habría ninguna indicación cuando sea apropiado que git verifique el estado como la sesión de herramientas ya se inició y puede continuar después de que se complete la fusión. –

22

Si su mergetool de elección es compatible con la apertura de los archivos en una instancia existente, puede especificar el comando en su git config:

% git config mergetool.whatever_you_want.cmd 'exec /path/to/merge/tool $LOCAL $MERGED $REMOTE' 
% git config merge.tool whatever_you_want 

git mergetool luego ejecutar su comando personalizado y luego le pedirá en cuanto a si el archivo se fusionó con éxito (en lugar de buscar un código de salida).

Un ejemplo que acabo hackeado juntos por vimdiff:

% git config mergetool.persistent.cmd 'gvim --remote-tab-silent "+set buftype=nowrite" "$PWD/$BASE" && sleep 1; gvim --remote-send ":split $PWD/$REMOTE<CR>:set buftype=nowrite<CR>:vertical diffsplit $PWD/$MERGED<CR>:vertical diffsplit $PWD/$LOCAL<CR>:set buftype=nowrite<CR><C-W>l"' 

Esto funciona bastante bien, puedo empezar a usarlo yo mismo!

+0

Interesante. Voy a intentar eso con WinMerge. +1 – VonC

+0

Tengo que admitir que eso es asombroso. Definitivamente tendré que ver qué puedo piratear para Meld. –

+0

Parece que hay un parche pendiente y error para permitir que meld se use de esta manera: http://bugzilla.gnome.org/show_bug.cgi?id=453670 –