2009-04-23 11 views
21

Ho appena iniziato usando Git ed è possibile che ho perso qualcosa di ovvio, ma qui va:Come configurare DiffMerge con msysgit/gitk?

  • sto usando msysgit 1.6.2.2 su Windows XP
  • Durante l'installazione, ho scelto l'opzione 1 a "usare Git Bash solo"

sto cercando di mettere insieme uno script wrapper che posso usare per sostituire il costruito nel git diff con DiffMerge. Sulla base di this thread su SO, ho creato il seguente file batch:

@echo off 
REM ---- Switch forward slashes to back slashes ---- 
set oldW=%2 
set oldW=%oldW:/=\% 
set newW=%5 
set newW=%newW:/=\% 

REM ---- Launch DiffMerge ---- 
"C:/Programs/SourceGear/DiffMerge/DiffMerge.exe" /title1="Old Version" %oldW% /title2="New Version" %newW% 

ho messo il file bat sotto% GIT_INSTALL%/cmd e modificato il mio file di .gitconfig come segue:

[diff] 
external = C:/Programs/git/cmd/git-diff-wrapper.bat 

Se io lancio Git Bash ed esegui git diff HEAD HEAD ~ - myfile

Ricevo un messaggio File (\dev\null) not found - che dato che sono su Windows non è sorprendente.

Premendo su, ho lanciato gitk e in Modifica> Preferenze, ho scelto lo stesso script di wrapper. Provare l'opzione "diff esterna" per un particolare file dà il messaggio di errore criptico Unknown Option "

Chiaramente, non ho idea di cosa sto facendo più quindi qualsiasi aiuto sarebbe molto apprezzato.

+0

Ho appena completato la risposta con alcuni elementi specifici "DiffMerge", come richiesto. – VonC

risposta

9

Ho appena vissuto un'esperienza simile con setting Notepad++ as my external editor with msysgit1.6.2.2.

La chiave era capire che il wrapper non era uno script DOS, ma uno script/bin/sh.

Quindi, cercare di mettere nel vostro ".bat" (anche se non è esattamente uno script bat, l'estensione non è importante qui):

#!/bin/sh 

# diff is called by git with 7 parameters: 
# path old-file old-hex old-mode new-file new-hex new-mode 

"C:/Programs/SourceGear/DiffMerge/DiffMerge.exe" /title1="Old Version" "$2" /title2="New Version" "$5" | cat 

Non preoccuparti di fare tutto il '\' vai '/': viene eseguito dagli script Git che chiamano lo strumento diff esterno.

Non l'ho provato con DiffMerge, ma con WinMerge funziona perfettamente, sia da una sessione DOS che da Git Shell.

#!/bin/sh 
"C:/Program Files/WinMerge/WinMergeU.exe" -e -ub "$2" "$5" | cat 

(con l'opzione '-e', ho tipo appena ot su 'ESC' per chiudere e uscire dallo strumento diff: che le grandi opere)


alt textaverage_geek aggiunge nei commenti :

ha aggiunto l'intestazione '/bin/sh' e ha provato a eseguire nuovamente git diff.
Questa volta l'errore è:
Unexpected parameter 'C:/Docume~/avggeek/LOCALS~1/Temp/.diff_b08444
C'è un modo per vedere quali sono i parametri passati sempre quando chiamo git diff?

1/C'è effettivamente un modo per vedere quali sono i parametri che vengono superati!
aggiungere la seguente riga nel file C:\Program Files\Git\libexec\git-core\git-sh-setup:

git_editor() { 
    : "${GIT_EDITOR:=$(git config core.editor)}" 
    : "${GIT_EDITOR:=${VISUAL:-${EDITOR}}}" 
    case "$GIT_EDITOR,$TERM" in 
    ,dumb) 
     echo >&2 "No editor specified in GIT_EDITOR, core.editor, VISUAL," 
     echo >&2 "or EDITOR. Tried to fall back to vi but terminal is dumb." 
     echo >&2 "Please set one of these variables to an appropriate" 
     echo >&2 "editor or run $0 with options that will not cause an" 
     echo >&2 "editor to be invoked (e.g., -m or -F for git-commit)." 
     exit 1 
     ;; 
    esac 
#### ADD THIS LINE BELOW 
    echo >&2 "editor is ${GIT_EDITOR:=vi} [email protected]" 
#### END ADDITION ABOVE 
    eval "${GIT_EDITOR:=vi}" '"[email protected]"' 
} 

Si vedrà quale editor viene chiamato, con quale parametro.

Ora, per quanto riguarda il parametro "Unexpected" parte:
ho avuto lo stesso tipo di errore quando ho chiamato WinMergeU.exe con "/e /ub" invece di "-e -ub", quindi prima domanda è:
Sei sicuro che il bit "/title1" non può essere utilizzato come "-title1" o "-t1" o "--title1" o "--t1"? Questo è ciò che è possibile vedere dallo chapter 9 "Command Lines Arguments" of the pdf documentation of DiffMerge.
In caso contrario, ho il sospetto che alcune virgolette siano in ordine per delimitare correttamente i diversi parametri. Qualcosa di simile:

"/title1="Old Version"" "$2" "/title2="New Version"" "$5" 
or 
"/title1=\"Old Version\"" "$2" "/title2=\"New Version\"" "$5" 

Ma il mio denaro sarebbe piuttosto essere sul "-title1" o la forma "-t1":

-t1="Old Version" "$2" -t2="New Version" "$5" 

dovrebbe funzionare bene.

+0

Ho aggiunto l'intestazione '/ bin/sh' e ho provato a eseguire nuovamente git diff. Questa volta l'errore è: Parametro inaspettato 'C: /Docume~'/avggeek/LOCALS~1/Temp/.diff_b08444 C'è un modo per vedere quali sono i parametri che vengono superati quando chiamo 'git diff'? –

+0

"La chiave era capire che il wrapper non era uno script DOS, ma uno script/bin/sh." Per quelli come me che non attivano l'opzione "Usa solo Git Bash", deve essere uno script di Windows (.cmd è più alla moda ...) Come il tuo ma usando% 2 invece di $ 2 – PhiLho

4

VonC - passaggio a -t1 e -t2 risolto gli errori. Diffmerge ora funziona per git bash :)

Dopo un po 'di spunta a the gitk patch che ha aggiunto il supporto di Diff Ester, mi sono reso conto che sta chiamando un programma Diff esterno direttamente con i due file come argomenti. Così ho modificato gitk> Modifica> Preferenze e mettere il seguente comando direttamente l'opzione strumento diff esterno:

"C:/Programs/SourceGear/DiffMerge/DiffMerge.exe" -t1="Old Version" -t2="New Version" 

ora ho DiffMerge lavorare per gitk troppo :-)

+0

Fantastico, ha funzionato! E grazie per il feedback su gitk. +1 – VonC

+0

Con il più recente percorso Diffmerge è più probabile che "C:/Programmi/SourceGear/Common/DiffMerge/sgdm.exe" e -t1/-t2 non funzioni più. Se lo fai da parte, ottieni almeno la finestra di confronto – Ghita

8

Questo funziona per me con il seguente :

In ~/.gitconfig:

[merge] 
tool = diffmerge 
[mergetool "diffmerge"] 
cmd = \"C:/Program Files/git/cmd/git-diffmerge-merge.sh\" \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\" 
trustExitCode = false 

In C:\Program Files\Git\cmd\git-diffmerge-merge.sh:

#!/bin/sh 

localPath="$2" 
basePath="$1" 
remotePath="$3" 
resultPath="$4" 

if [ ! -f $basePath ] 
then 
    basePath="~/diffmerge-empty" 
fi 

"C:/Program Files/SourceGear/DiffMerge/DiffMerge.exe" --merge --result="$resultPath" "$localPath" "$basePath" "$remotePath" --title1="Mine" --title2="Merged: $4" --title3="Theirs" 

Una parte del merito va a http://therightstuff.de/2009/01/28/Setting-Up-SourceGear-DiffMerge-With-Git.aspx;)

+0

Grazie. Mi hai salvato con questo. – Andrei

14

Ho cercato su internet per la risposta a questa. Ho provato tutte le soluzioni sopra e altrove. Potrei far funzionare la parte di fusione e non la parte diff o viceversa. Quindi quello che ho fatto alla fine è stato quello di hackerare insieme la mia soluzione semplice da tutte le informazioni che ho trovato su internet che funzionano per me. Non richiede alcun script solo per modificare il tuo .gitconfig che normalmente risiede nella seguente directory C:\Documents and Settings\[username] Avrai bisogno di avere già installato il programma DiffMerge.

Ecco l'estratto pertinente del mio file .gitconfig. Dovrai solo modificare il percorso in cui si trova la tua versione di DiffMerge. Nota: che ho usato il vecchio DOS 8.3 Formato nel percorso

[diff] 
    tool = diffm 
[difftool "diffm"] 
    cmd = "H:/PROGRA~1/SourceGear/DiffMerge/DiffMerge.exe $LOCAL $REMOTE" 
    prompt = false 

[merge] 
    tool = diffmerge 
[mergetool "diffmerge"] 
    cmd = "H:/PROGRA~1/SourceGear/DiffMerge/DiffMerge.exe --merge --result=$MERGED $LOCAL $BASE $REMOTE" 
    trustExitCode = false 
    keepBackup = false 

È anche possibile configurarlo utilizzando i comandi git config --replace --global [options] se lo desiderate.


Questa semplice soluzione funziona perfettamente anche per me. Per le versioni più recenti di DiffMerge (3.3.1), è necessario modificare il percorso del comando:

cmd = "C:/PROGRA~1/SourceGear/Common/DiffMerge/sgdm.exe ...etc..." 
+0

Puntelli per una soluzione semplice che ha senso. – Bnjmn

+0

Come @Bnjmn ha detto, +1 per una soluzione semplice che richiede solo la modifica .gitconfig – JeffH

+0

La chiave per me stava cambiando '.../merge/replace = ...' in '... --merge --replace =. ..'; [I documenti di SourceGear] (https://sourcegear.com/diffmerge/webhelp/sec__git__windows__msysgit.html) sembrano sbagliati. –

Problemi correlati