ver tool example contraseña configuracion cambiar autenticacion git git-merge kdiff3 mergetool

example - git mergetool



¿Cómo podría forzar la interfaz gráfica de usuario de mergetool(KDiff3) para que se muestre siempre? (3)

¿Cómo podría forzar la interfaz gráfica de usuario de mergetool para que se muestre siempre y deshabilitar cualquier resolución automática?

A veces, cuando hay un conflicto durante una fusión y uso el mergetool, simplemente vuelve inmediatamente después de presionar Enter en la pregunta "Hit return para iniciar la herramienta de resolución de fusión (kdiff3)" y no se muestra la GUI y el conflicto parece haberse resuelto.

Tengo Git configurado para usar KDiff3 como mergetool ahora, pero también sucedió cuando tuve el codecompare como mergetool especificado. Sé que hay una opción "Guardar automáticamente y salir en una combinación sin conflictos" en KDiff3, que en teoría podría causar el comportamiento descrito, pero esta opción está desactivada / desactivada todo el tiempo.

Además, existe la opción trustExitCode directamente en Git mergetool gitconfig, que he establecido en verdadero, pero incluso si lo establezco en falso, no se muestra la GUI.

No estoy seguro de quién hace la resolución automática de todos modos. Mergetool en algún preprocesamiento o KDiff3?

Estoy ejecutando en Windows y tengo las extensiones Git instaladas.

También se formuló una pregunta similar específica a KDiff3 aquí: Kdiff3 no se abrirá con el comando mergetool


El comportamiento de git mergetool es completamente dependiente de la herramienta de fusión elegida y la línea de comando que Git le pasa. Por lo tanto, para cambiar su comportamiento, necesita encontrar una línea de comandos que haga lo que quiere y configurar Git para usar esa línea de comandos.

Yo mismo tuve esta pregunta (específicamente con respecto a KDiff3), y la respuesta de PiQuer me ayudó en parte, pero me hizo pensar. Debería haber una manera de replicar el comportamiento predeterminado de Git exactamente para KDiff3, excepto sin la opción --auto (que es lo que hace que KDiff3 no muestre la GUI).

Parece que la fuente del comando predeterminado para la herramienta de combinación KDiff3 está en el archivo git/mergetools/kdiff3 . Parece un script de shell, ¡así que deberíamos poder copiarlo exactamente! Poner eso en una línea, eliminar --auto , y escapar de las cosas nos da esto:

git config --global mergetool.kdiff3.cmd "if /"/$base_present/"; then /"/$merge_tool_path/" --L1 /"/$MERGED (Base)/" --L2 /"/$MERGED (Local)/" --L3 /"/$MERGED (Remote)/" -o /"/$MERGED/" /"/$BASE/" /"/$LOCAL/" /"/$REMOTE/" >/dev/null 2>&1; else /"/$merge_tool_path/" --L1 /"/$MERGED (Local)/" --L2 /"/$MERGED (Remote)/" -o /"/$MERGED/" /"/$LOCAL/" /"/$REMOTE/" >/dev/null 2>&1; fi"

Las variables base_present y merge_tool_path no se mencionan específicamente en la documentación de Git, ya que están disponibles para su uso en mergetool.<tool>.cmd , por lo que es posible que en algún momento en el futuro este comando no funcione como está. Sin embargo, podrían reemplazarse fácilmente con un comando para probar si BASE refiere a un archivo que existe y una ruta codificada para KDiff3, respectivamente.

Tenga en cuenta que el comando anterior reemplaza el comando predeterminado para la herramienta de combinación kdiff3 de Git en lugar de crear una separada.

Con respecto a un par de otros puntos en la pregunta original:

  • La configuración trustExitCode le dice a Git si el código de salida de la herramienta de combinación es una indicación adecuada de si la combinación se realizó correctamente. No afectará el comportamiento de la herramienta de combinación, sino el comportamiento de Git una vez que la herramienta de fusión haya salido. Consulte el manual de git-mergetool .
  • La resolución automática que está viendo después de escribir git mergetool se realiza mediante la propia herramienta de combinación. git mergetool simplemente invoca la herramienta externa en las versiones de archivo que deben fusionarse.

En lugar de configurar mergetool, que se llama solo cuando hay un conflicto, simplemente configure un controlador de combinación con KDiff3:

git config merge.kdiff.driver ''kdiff3 "%O" "%A" "%B" -o "%A" --L1 "Nearest Common ancestor" -L2 "Working Copy" --L3 "Version from Other Branch"''

Puede hacer que este controlador sea global agregando --global . Pero necesita agregar un atributo .gitat en su repositorio:

* merge=kdiff


Git tiene --auto codificado como una opción de línea de comandos para KDiff3, lo que hace que la GUI no se muestre si KDiff3 resuelve automáticamente todos los conflictos. En la configuración de KDiff3 puede especificar opciones de línea de comandos para ignorar, pero poner --auto no funcionó para mí.

Como solución, configuré mi propia variante de KDiff3 como la herramienta de combinación:

git config --global mergetool.kdiff3NoAuto.cmd "kdiff3 --L1 /"/$MERGED (Base)/" --L2 /"/$MERGED (Local)/" --L3 /"/$MERGED (Remote)/" -o /"/$MERGED/" /"/$BASE/" /"/$LOCAL/" /"/$REMOTE/""

Esto es muy similar a lo que Git usa de forma predeterminada para KDiff3, pero sin el indicador --auto .

Ahora puede llamar a git mergetool -t kdiff3NoAuto o configurar kdiff3NoAuto como mergetool globalmente y KDiff3 siempre se mostrará cuando resuelva conflictos.

Con respecto a la segunda parte de su pregunta, si realmente desea deshabilitar cualquier resolución automática, simplemente agregue --qall a la línea de comando kdiff3 de arriba. Pero luego tiene que resolver manualmente todos los cambios en el archivo manualmente, incluso los que no produjeron un conflicto de Git. El mejor escenario sería: KDiff3 muestra cómo Git fusionó los archivos y deja abiertos los conflictos para que el usuario los elija.