Git: Cómo configurar KDiff3 como herramienta de fusión y herramienta de diferencias

219

Recientemente estaba usando GitExtension 2.46, pero la versión de Git que tiene el mismo es 1.9.4.msysgit.2. Dispuesto a usar solo comandos Git, desinstalé GitExtension e instalé la última versión disponible de Git y KDiff3 .

Cuando hago una fusión y tengo conflictos, ejecuto el siguiente comando:

$ git mergetool

Entonces recibo el mensaje:

La herramienta de combinación kdiff3 no está disponible como 'kdiff3'.

Supongo que debe ser por el camino KDiff3.

Ambiente

  • SO: Windows 10
  • Git 2.6.1.windows.1
  • KDiff3 0.9.98 (64 bits)

Preguntas:

  • ¿Qué debo configurar en el archivo .gitconfig para que el comando $ git mergetoolabra la GUI de KDiff3 con las versiones LOCAL , REMOTO , BASE y MERGED del archivo en conflicto?

  • ¿Cómo configurarlo para usarlo tiene la herramienta diff?

Joseph
fuente
Publicación relacionada: cómo configurar una herramienta diff en Git en general .
RBT

Respuestas:

374

Estos sitios fueron muy útiles, casi, mergetool y difftool . Utilicé la configuración global, pero el repositorio puede usarla sin problemas. Solo necesita ejecutar los siguientes comandos:

git config --global merge.tool kdiff3
git config --global mergetool.kdiff3.path "C:/Program Files/KDiff3/kdiff3.exe"
git config --global mergetool.kdiff3.trustExitCode false

git config --global diff.guitool kdiff3
git config --global difftool.kdiff3.path "C:/Program Files/KDiff3/kdiff3.exe"
git config --global difftool.kdiff3.trustExitCode false

El uso de la trustExitCodeopción depende de lo que desee hacer cuando regrese la herramienta diff. De la documentación :

git-difftool invoca una herramienta diff individualmente en cada archivo. Los errores reportados por la herramienta diff son ignorados por defecto. Use --trust-exit-code para hacer que git-difftool salga cuando una herramienta diff invocada devuelve un código de salida distinto de cero.

Joseph
fuente
55
Aún así, ¿por qué querría que git-difftool no salga si kdiff3 falla?
David Torres
99
Para que tenga la herramienta diff reconocida por Visual Studio 2015, tuve que cambiar esta línea git config --global --add diff.guitool kdiff3 a esta: git config --global --add diff.tool kdiff3
Guillaume Raymond
2
@DavidTorres Probablemente porque las herramientas de Windows con un mal comportamiento (que salen con códigos distintos de cero en caso de éxito) lo arruinan para todos.
Matthew Flaschen
2
Según los documentos a los que se hace referencia, no es necesario establecer trustExitCode en falso, ya que el valor predeterminado es ignorarlo de todos modos.
Matt Wilkie
77
AFAIK, --addagregará una segunda o tercera entrada cuando se invoque varias veces. Eso es difícil de arreglar más tarde, porque simplemente no se puede eliminar con --remove. Solo establecer un valor sin --adddebería estar bien.
Thomas Weller
58

Solo para extender la respuesta de @ Joseph :

Después de aplicar estos comandos, su .gitconfigarchivo global tendrá las siguientes líneas (para acelerar el proceso, simplemente puede copiarlas en el archivo) :

[merge]
    tool = kdiff3
[mergetool "kdiff3"]
    path = C:/Program Files/KDiff3/kdiff3.exe
    trustExitCode = false
[diff]
    guitool = kdiff3
[difftool "kdiff3"]
    path = C:/Program Files/KDiff3/kdiff3.exe
    trustExitCode = false
Igor Kustov
fuente
@ Alex78191, mi respuesta refleja la respuesta de Joseph y allí puede encontrar más detalles sobre esta configuración.
Igor Kustov
55
Me llevó mucho tiempo hacer esto bien. Dos cosas me llevaron por mal camino: (1) El .gitconfigarchivo que estaba editando no era el que estaba siendo usado. Ver stackoverflow.com/questions/2114111/… para identificar los que se están cargando. (2) No mezcle y combine cmd =y path =en gitconfig, TL; DR: elimine cmd y solo use path
matt wilkie
1
Ahora en git bash use .... git difftool <nombre de archivo> o git difftool simple para ejecutar el diff gui kdiff3 que acaba de configurar.
Vivek
32

Para usuarios de Mac

Aquí está la respuesta aceptada de @ Joseph, pero con la ubicación predeterminada de la ruta de instalación de Mac de kdiff3

(Tenga en cuenta que puede copiar y pegar esto y ejecutarlo de una vez)

git config --global --add merge.tool kdiff3 
git config --global --add mergetool.kdiff3.path  "/Applications/kdiff3.app/Contents/MacOS/kdiff3" 
git config --global --add mergetool.kdiff3.trustExitCode false

git config --global --add diff.guitool kdiff3
git config --global --add difftool.kdiff3.path "/Applications/kdiff3.app/Contents/MacOS/kdiff3"
git config --global --add difftool.kdiff3.trustExitCode false
kris
fuente
44
No lo use --addya que eso puede dar como resultado 2 entradas de configuración si ejecuta el comando dos veces. Es un desastre limpiar esto, porque ya no puedes eliminar una sola entrada. Consulte git-scm.com/docs/git-config : "Se pueden agregar varias líneas a una opción"
Thomas Weller,
11

Bueno, el problema es que Git no puede encontrar KDiff3 en% PATH%.

En una instalación típica Unix todos los ejecutables residen en varios lugares bien conocidos ( /bin/, /usr/bin/, /usr/local/bin/, etc.), y uno puede invocar un programa simplemente escribiendo su nombre en un procesador de shell (por ejemplo,cmd.exe :)).

En Microsoft Windows, los programas generalmente se instalan en rutas dedicadas, por lo que no puede simplemente escribir kdiff3uncmd sesión y ejecutar KDiff3.

La solución difícil: debe decirle a Git dónde encontrar KDiff3 especificando la ruta completa a kdiff3.exe. Desafortunadamente, a Git no le gustan los espacios en la especificación de ruta en su configuración, por lo que la última vez que lo necesité, terminé con esos antiguos "C: \ Progra ~ 1 ... \ kdiff3.exe" como si fuera tarde 1990s :)

La solución simple: edite la configuración de su computadora e incluya el directorio con kdiff3.exe en% PATH%. Luego pruebe si puede invocarlo desde cmd.exe por su nombre y luego ejecute Git.

usuario3159253
fuente
8

Necesitaba agregar los parámetros de la línea de comando o KDiff3 solo se abriría sin archivos y me pediría una base, local y remota. Usé la versión suministrada con TortoiseHg .

Además, necesitaba recurrir a los viejos y buenos nombres de archivo DOS 8.3.

[merge]
    tool = kdiff3

[mergetool "kdiff3"]
    cmd = /c/Progra~1/TortoiseHg/lib/kdiff3.exe $BASE $LOCAL $REMOTE -o $MERGED

Sin embargo, funciona correctamente ahora.

martín
fuente
6

Para enmendar la respuesta de kris , comenzando con Git 2.20 (Q4 2018), el comando adecuado para serágit mergetool

git config --global merge.guitool kdiff3 

Esto se debe a que " git mergetool" aprendió a tomar la --[no-]guiopción " ", al igual que "git difftool ".

Ver commit c217b93 , commit 57ba181 , commit 063f2bd (24 Oct 2018) por Denton Liu ( Denton-L) .
(Fusión por Junio ​​C Hamano - gitster- en commit 87c15d1 , 30 oct 2018)

mergetool: aceptar -g/--[no-]guicomo argumentos

En línea con cómo difftoolacepta una -g/--[no-]guiopción, haga mergetoolaceptar la misma opción para usar la merge.guitoolvariable para encontrar la herramienta de combinación predeterminada en lugar de merge.tool.

VonC
fuente
5

(Al tratar de descubrir cómo usar kdiff3 de WSL git, terminé aquí y obtuve las piezas finales, así que publicaré mi solución para cualquier otra persona que también tropiece aquí mientras trato de encontrar esa respuesta)

Cómo usar kdiff3 como herramienta diff / merge para WSL git

Con Windows Update 1903 es mucho más fácil; simplemente use wslpath y no hay necesidad de compartir TMP de Windows a WSL ya que el lado de Windows ahora tiene acceso al sistema de archivos WSL a través de \ wsl $:

[merge]
    renormalize = true
    guitool = kdiff3
[diff]
    tool = kdiff3
[difftool]
    prompt = false
[difftool "kdiff3"]
    # Unix style paths must be converted to windows path style
    cmd = kdiff3.exe \"`wslpath -w $LOCAL`\" \"`wslpath -w $REMOTE`\"
    trustExitCode = false
[mergetool]
    keepBackup = false
    prompt = false
[mergetool "kdiff3"]
    path = kdiff3.exe
    trustExitCode = false

Antes de la actualización de Windows 1903

Pasos para usar kdiff3 instalado en Windows 10 como herramienta diff / merge para git en WSL:

  1. Agregue el directorio de instalación de kdiff3 a la ruta de Windows.
  2. Agregue TMP a la variable de entorno Windows WSLENV (WSLENV = TMP / up). Git usará el directorio TMP para archivos temporales, como revisiones anteriores de archivos, por lo que la ruta debe estar en el sistema de archivos de Windows para que esto funcione.
  3. Establezca TMPDIR en TMP en .bashrc:
# If TMP is passed via WSLENV then use it as TMPDIR
[[ ! -z "$WSLENV" && ! -z "$TMP" ]] && export TMPDIR=$TMP
  1. Convierta unix-path a windows-path cuando llame a kdiff3. Muestra de mi .gitconfig:
[merge]
    renormalize = true
    guitool = kdiff3
[diff]
    tool = kdiff3
[difftool]
    prompt = false
[difftool "kdiff3"]
    #path = kdiff3.exe
    # Unix style paths must be converted to windows path style by changing '/mnt/c/' or '/c/' to 'c:/'
    cmd = kdiff3.exe \"`echo $LOCAL | sed 's_^\\(/mnt\\)\\?/\\([a-z]\\)/_\\2:/_'`\" \"`echo $REMOTE | sed 's_^\\(/mnt\\)\\?/\\([a-z]\\)/_\\2:/_'`\"
    trustExitCode = false
[mergetool]
    keepBackup = false
    prompt = false
[mergetool "kdiff3"]
    path = kdiff3.exe
    trustExitCode = false
reajuste salarial
fuente