2012-01-27 17 views
14

Había configurado mi git para usar P4Merge como la herramienta diff, como se describe here. Entonces, git diff activará el P4Merge.Herramientas diff múltiples

Sin embargo, a veces me parece que trabajar con UNIX diff es más rápido y más eficiente (porque no se necesita GUI). ¿Cómo configuro git para que pueda elegir fácilmente qué herramienta de diferenciación me gustaría activar? es posible? Por ejemplo:

$ git diff  # to trigger P4Merge 
$ git difftool # to trigger UNIX diff 

Mi git config --list:

code.editor=vi 
merge.tool=p4merge 
mergetool.extMerge.cmd=extMerge $BASE $LOCAL $REMOTE $MERGED 
mergetool.extMerge.trustexitcode=false 
diff.external=extDiff 
mergetool.prompt=false 
mergetool.keepbackup=false 
mergetool.p4merge.path=/usr/local/bin/p4merge 
+0

La URL * aquí * mencionada anteriormente está rota, ¿pueden actualizarla? – realPK

Respuesta

6

ACTUALIZACIÓN: Si como OP desea hacer git difftool invocar la funcionalidad de diferencias por defecto en lugar de una herramienta externa a continuación, la versión simple al final de esta respuesta funciona Sin embargo el método Yo prefiero y recomiendo si lo que desea múltiples herramientas de diferenciación es el método de archivo .gitconfig como se describe en DrStrangeprok's answer.


Puede establecer la siguiente secuencia de comandos bash como su herramienta de edición externa.
(es decir: reemplace el contenido de extDiff con él)
No es tan simple como git diif1/git diff2 pero funciona.

EDIT: ver abajo para una versión más simple

#!/bin/bash 

# Parameters from git: 
# 1 2  3  4  5  6  7 
# path old-file old-hex old-mode new-file new-hex new-mode 

CONTINUE=1 
while [ $CONTINUE == 1 ] 
do 

    # Present Options 
    echo "1. P4Merge" 
    echo "2. Unix diff" 
    echo "3. Cancel" 
    echo -n "Choose diff tool[1]: " 

    # Read in user choice 
    read -n 1 OPTION 

    # move down a line 
    echo "" 

    # if user didn't enter a choice default to 1 
    if [[ $OPTION == "" ]] ; then 
     OPTION="1" 
    fi 

    # Launch diff tool based on OPTION 
    case $OPTION in 
     1) /Applications/p4merge.app/Contents/MacOS/p4merge "$2" "$5" ; CONTINUE=0 ;; 
     2) diff "$2" "$5" ; CONTINUE=0 ;; 
     3) exit ;; 
     *) echo "\"$OPTION\" is not valid " ;; 
    esac 


    # This sleep has two purposes 
    # 1) on an invalid choice it delays the menu just a hair 
    # 2) keeps this script alive long enough that git will not just move onto the next file 
    # instantly if diffing multiple files. 
    sleep 1 

done 

versión simple sin un menú
añadir esta función a su .bashrc si utiliza 'difftool git', entonces se utilizará la de diferencias por defecto

function git { 

    if [[ $1 == "difftool" ]] ; then 
     git config --global --unset diff.external 
     command git diff 
     git config --global diff.external extDiff 
    else 
     command git "[email protected]" 
    fi 

} 
+0

¿Algo más simple que esto? :) – moey

+1

Sí en realidad, pensé en otra forma mucho más parecida a lo que querías, edité mi respuesta por encima de – Appak

+0

@Appak, probablemente debas hacerlo 'command git" $ @ "' porque de lo contrario 'git commit -am" todo hecho "' no funcionará –

1

Sería bueno si Git de alguna manera puede tener configuraciones diferentes para cada una, pero si no, para expandir la respuesta de Appak, lo siguiente agregado a .bashrc puede invocar texto diff, opendiff (FileMerge), o P4Merge diff:

function git { 
    if [ $1 == "tdiff" ] 
    then 
     git config --global --unset diff.external 
     command git diff 
    elif [ $1 == "diff" ] 
    then 
     git config --global diff.external ~/bin/git-diff-opendiff 
     command git diff 
    elif [ $1 == "pdiff" ] 
    then 
     git config --global diff.external ~/bin/git-diff-p4diff 
     command git diff 
    else 
     command git "[email protected]" 
    fi 
} 

y simplemente asegurarse de que tiene el correcto git-diff-opendiff y git-diff-p4diff ya establecido (que son los scripts de shell).

4

Git puede administrar fácilmente una diferencia visual y de línea de comando. No se requiere ajustes de fantasía

git diff (por defecto) utiliza UNIX diff

si desea utilizar una herramienta diffing visual, así la forma correcta para su instalación está en su archivo ~/.gitconfig con una sección como esta :

[difftool "Kaleidoscope"] 
    cmd = ksdiff --partial-changeset --relative-path \"$MERGED\" -- \"$LOCAL\" \"$REMOTE\" 

lo que viene después de la cmd = es específica para su aplicación diffing visual particular.

Es no práctica estándar para manipular git diff para enviar contenido a una aplicación visual. Como tal, la pregunta busca una respuesta 100% hacia atrás de la funcionalidad incorporada.

Consulte el git-difftool man page para obtener más información.

3

Puede indicar explícitamente qué herramienta de difusión desea utilizar. Tengo esto en mi ~/.gitconfig:

[diff] 
    tool = vimdiff 

[difftool "winmerge"] 
    name = WinMerge 
    trustExitCode = true 
    cmd = "/c/Users/rkasten/Google\\ Drive/Apps/WinMerge/WinMergeU.exe" -u -e $LOCAL $REMOTE 

Y luego tengo la siguiente configurar alias:

alias gdt='git difftool' 
alias gdtw='git difftool --tool=winmerge' 

Usando el ejemplo de masukomi, sólo podría añadir lo siguiente a su gitconfig:

[difftool "Kaleidoscope"] 
    cmd = ksdiff --whatevs 

Y use alias gdtk='git difftool --tool=Kaleidoscope' para usar Kaleidoscope.

Todo esto funciona en git 2.7.

0

Escribes

Sin embargo, a veces me ha parecido trabajar con el diff Unix es más rápido y más eficiente (porque ninguna interfaz gráfica de usuario involucrado). ¿Cómo configuro git para que pueda elegir fácilmente qué herramienta de diferenciación me gustaría activar?

Así que la respuesta a esta pregunta debería simplemente aprovechar la capacidad de git de diferenciar entre las herramientas de diferencias basadas en consola y gui y no confiar en escribir un comando externo.

Al ofrecer la opción -g a git difftool, la herramienta de diferencias de usar se leerá de la variable diff.guitool configurado en lugar de diff.tool.

[alias] 
    d = difftool -g 
    dc = difftool 
[diff] 
    guitool = p4merge 
    tool = diff 

Eso es todo. Invocaría su herramienta GUI p4merge usando git d <file1> <file2> o similar y su herramienta de consola usando git dc <file1> <file2>.