2012-01-27 9 views
14

Avevo impostato il mio git per utilizzare P4Merge come strumento diff, come descritto here. Quindi, git diff attiverà P4Merge.Strumenti differ multipli

Tuttavia, a volte trovo che lavorare con UNIX diff sia più veloce e più efficiente (perché non è coinvolta alcuna GUI). Come faccio a configurare git in modo da poter scegliere con facilità quale strumento diff mi piacerebbe attivare? È possibile? Per esempio:

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

mio 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

L'URL * qui * sopra menzionato è rotto, puoi aggiornare? – realPK

risposta

6

UPDATE: Se come OP si vuole fare git difftool richiamare la funzionalità predefinita diff invece di uno strumento esterno poi semplice versione alla fine del questa risposta funziona. Tuttavia, il metodo che preferisco e consiglio se si vuole solo più strumenti diff è il metodo di file .gitconfig come descritto nella DrStrangeprok's answer.


È possibile impostare il seguente script bash come strumento di editing esterno.
(es .: sostituire il contenuto di extDiff con esso)
Non è così semplice come git diif1/git diff2 ma funziona.

EDIT: vedi in basso per una versione più semplice

#!/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 

versione semplice senza un menu
aggiungere questa funzione al vostro .bashrc se si utilizza 'difftool git' allora utilizzerà il diff di default

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

Qualcosa di più semplice di questo? :) – moey

+1

Sì, in realtà, ho solo pensato ad un altro modo molto più simile a quello che volevi, ho modificato la mia risposta sopra – Appak

+0

@Appak probabilmente hai bisogno di renderlo 'command git" $ @ "' invece perché altrimenti 'git commit -am" tutto fatto "non funzionerà –

1

Sarebbe bello se Git potesse in qualche modo avere impostazioni diverse per ciascuna, ma in caso contrario, per espandere la risposta di Appak, il seguente aggiunto a .bashrc può richiamare diff di testo, opendiff (FileMerge) o diff P4Merge:

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 
} 

e solo assicurarsi di avere la giusta git-diff-opendiff e git-diff-p4diff già istituito (sono gli script di shell).

4

Git può gestire facilmente un visual e diff di riga di comando. No tweaking fantasia è richiesto

git diff (per impostazione predefinita) utilizza unix diff

se si desidera utilizzare uno strumento diffing visivo e il modo corretto per configurarlo è nel file ~/.gitconfig con una sezione come questo :

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

ciò che viene dopo la cmd = è specifico per una particolare applicazione diffing visivo.

È non pratica standard per manipolare git diff per inviare il contenuto a un'applicazione visiva. In quanto tale, la domanda cerca una risposta arretrata al 100% dalla funzionalità integrata.

Vedere git-difftool man page per ulteriori dettagli.

3

Si può semplicemente indicare quale difftool si desidera utilizzare. Ho questo nel mio ~/.gitconfig:

[diff] 
    tool = vimdiff 

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

E poi ho la seguente configurazione alias:

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

Utilizzando l'esempio di masukomi, si può solo aggiungere quanto segue al vostro gitconfig:

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

E usare alias gdtk='git difftool --tool=Kaleidoscope' per usare il caleidoscopio.

Tutto questo funziona in git 2.7.

0

si scrive

Tuttavia, a volte trovo a lavorare con il diff UNIX è più veloce e più efficiente (perché nessuna GUI coinvolto). Come faccio a configurare git in modo da poter scegliere con facilità quale strumento diff mi piacerebbe attivare?

Quindi la risposta a questa domanda dovrebbe semplicemente trarre vantaggio dalla capacità di Git di distinguere tra strumenti di diffusione basati su console e gui e non fare affidamento sulla scrittura di un comando esterno.

Fornendo l'opzione -g al git difftool, lo strumento diff utilizzare verranno letti dalla variabile configurata diff.guitool anziché diff.tool.

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

Questo è tutto. Avresti invocato il tuo strumento gui p4merge usando git d <file1> <file2> o simile e lo strumento console usando git dc <file1> <file2>.