Git su Windows: come si configura un mergetool?
Domanda
Ho provato msysGit e Git su Cygwin. Entrambi funzionano perfettamente in se stessi ed entrambi eseguono perfettamente gitk e git-gui.
Ora, come diamine devo configurare un mergetool? (Vimdiff funziona su Cygwin, ma preferibilmente vorrei qualcosa di un po 'più user-friendly per alcuni dei nostri colleghi amanti di Windows.)
Soluzione
Per dare seguito alla risposta di Charles Bailey, ecco la mia configurazione git che utilizza p4merge (strumento di unione a 3 vie multipiattaforma gratuito); testato sull'installazione di msys Git (Windows):
git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"'
oppure, da una shell cmd.exe di Windows, la seconda riga diventa:
git config --global mergetool.p4merge.cmd "p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\""
Le modifiche (relative a Charles Bailey):
- aggiunto alla configurazione globale di git, vale a dire valido per tutti i progetti git non solo quello corrente
- il valore di configurazione dello strumento personalizzato risiede in " mergetool. [tool] .cmd " ;, non " merge. [tool] .cmd " (stupidami, ho passato un'ora a risolvere il motivo per cui git continuava a lamentarsi di uno strumento inesistente)
- aggiunte doppie virgolette per tutti i nomi di file in modo che i file con spazi possano ancora essere trovati dallo strumento di unione (l'ho provato in msys Git da Powershell)
- si noti che per impostazione predefinita Perforce aggiungerà la sua directory di installazione a PATH, quindi non è necessario specificare il percorso completo di p4merge nel comando
Download: http: //www.perforce. com / prodotti / componenti / per forza-visual-merge-e-diff-tools
MODIFICA (febbraio 2014)
Come sottolineato da @Gregory Pakosz , ultimo msys git ora " nativamente " supporta p4merge (testato su 1.8.5.2.msysgit.0 ).
Puoi visualizzare l'elenco degli strumenti supportati eseguendo:
git mergetool --tool-help
Dovresti vedere p4merge nell'elenco disponibile o valido . In caso contrario, aggiorna il tuo git.
Se p4merge è stato elencato come disponibile , è nel tuo PERCORSO e devi solo impostare merge.tool :
git config --global merge.tool p4merge
Se è stato elencato come valido , è necessario definire mergetool.p4merge.path oltre a merge.tool :
git config --global mergetool.p4merge.path c:/Users/my-login/AppData/Local/Perforce/p4merge.exe
- Quanto sopra è un percorso di esempio in cui p4merge è stato installato per l'utente corrente, non a livello di sistema (non richiede diritti di amministratore o elevazione UAC)
- Sebbene
~
dovrebbe espandersi nella home directory dell'utente corrente (quindi in teoria il percorso dovrebbe essere~/AppData/Local/Perforce/p4merge.exe
), questo non ha funzionato per me - Ancora meglio sarebbe stato sfruttare una variabile d'ambiente (ad es.
$LOCALAPPDATA/Perforce/p4merge.exe
), git non sembra espandere le variabili d'ambiente per i percorsi (se sai come farlo funzionare, fammi sapere o aggiornalo risposta)
Altri suggerimenti
l'impostazione di mergetool.p4merge.cmd non funzionerà più da quando Git ha iniziato a provare a supportare p4merge, vedi libexec / git-core / git-mergetool--lib.so dobbiamo solo specificare il percorso di fusione per git, ad esempio il p4merge:
git config --global mergetool.p4merge.path 'C:\Program Files\Perforce\p4merge.exe'
git config --global merge.tool p4merge
Quindi funzionerà.
Sto usando Portable Git su WinXP (funziona a meraviglia!) e avevo bisogno di risolvere un conflitto che si presentava nella ramificazione. Di tutte le gui che ho controllato, KDiff3 si è rivelato il più trasparente da usare.
Ma ho trovato le istruzioni di cui avevo bisogno per farlo funzionare in Windows in questo post sul blog , istruzioni che differiscono leggermente dagli altri approcci elencati qui. Fondamentalmente equivaleva ad aggiungere queste righe al mio .gitconfig
file:
[merge]
tool = kdiff3
[mergetool "kdiff3"]
path = C:/YourPathToBinaryHere/KDiff3/kdiff3.exe
keepBackup = false
trustExitCode = false
Funziona bene adesso!
Sotto Cygwin, la unica cosa che ha funzionato per me è la seguente:
git config --global merge.tool myp4merge
git config --global mergetool.myp4merge.cmd 'p4merge.exe "$(cygpath -wla $BASE)" "$(cygpath -wla $LOCAL)" "$(cygpath -wla $REMOTE)" "$(cygpath -wla $MERGED)"'
git config --global diff.tool myp4diff
git config --global difftool.myp4diff.cmd 'p4merge.exe "$(cygpath -wla $LOCAL)" "$(cygpath -wla $REMOTE)"'
Inoltre, mi piace disattivare il messaggio di richiesta per difftool:
git config --global difftool.prompt false
git mergetool
è completamente configurabile, quindi puoi praticamente scegliere il tuo strumento preferito.
La documentazione completa è qui: http: // www.kernel.org/pub/software/scm/git/docs/git-mergetool.html
In breve, è possibile impostare una fusione predefinita impostando la variabile di configurazione utente merge.tool
.
Se lo strumento di unione è uno di quelli supportati nativamente da esso, è sufficiente impostare mergetool.<tool>.path
sul percorso completo dello strumento (sostituire <tool>
con ciò che è stato configurato mergetool.<tool>.cmd
in modo che sia.
Altrimenti, è possibile impostare $BASE, $LOCAL, $REMOTE, $MERGED
su un po 'di shell da valutare in fase di esecuzione con le variabili di shell git config
impostate sui file appropriati. Devi essere un po 'attento all'evasione se modifichi direttamente un file di configurazione o imposti la variabile con il comando <=>.
Qualcosa del genere dovrebbe dare il sapore di ciò che puoi fare ("mymerge" è uno strumento immaginario).
git config merge.tool mymerge
git config merge.mymerge.cmd 'mymerge.exe --base "$BASE" "$LOCAL" "$REMOTE" -o "$MERGED"'
Dopo aver impostato il tuo strumento di unione preferito, è semplicemente una questione di esecuzione <=> ogni volta che hai conflitti da risolvere.
Lo strumento p4merge di Perforce è uno strumento di unione autonomo abbastanza buono.
Al di là del confronto su Windows 7
git config --global merge.tool bc3
git config --global mergetool.bc3.path "C:\Program Files (x86)\Beyond Compare 3\BCompare.exe"
Sembra che le versioni più recenti di git supportino direttamente p4merge, quindi
git config --global merge.tool p4merge
dovrebbe essere tutto ciò di cui hai bisogno, se p4merge.exe è sul tuo percorso. Non è necessario impostare cmd o percorso.
Ho dovuto abbandonare le quotazioni extra usando msysGit su Windows 7, non so perché.
git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge $BASE $LOCAL $REMOTE $MERGED'
Se lo stai facendo tramite cygwin, potrebbe essere necessario utilizzare cygpath:
git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge `cygpath -w $BASE` `cygpath -w $LOCAL` `cygpath -w $REMOTE` `cygpath -w $MERGED`'
Bah, questo finalmente ha funzionato per me (Windows 7 + Cygwin + TortoiseMerge):
In .git / config:
cmd = TortoiseMerge.exe /base:$(cygpath -d \"$BASE\") /theirs:$(cygpath -d \"$REMOTE\") /mine:$(cygpath -d \"$LOCAL\") /merged:$(cygpath -d \"$MERGED\")
Grazie ai precedenti poster per il suggerimento di usare cygpath!
Uso un'app chiamata WinMerge ( http://winmerge.org/ ) informazioni dal loro manuale ( http://manual.winmerge.org/CommandLine.html )
questo è lo script bash che utilizzo dalla direttiva mergetool
tramite .gitconfig
#!/bin/sh
# using winmerge with git
# replaces unix style null files with a newly created empty windows temp file
file1=$1
if [ "$file1" == '/dev/null' ] || [ "$file1" == '\\.\nul' ] || [ ! -e "$file1" ]
then
file1="/tmp/gitnull"
`echo "">$file1`
fi
file2=$2
if [ "$file2" == '/dev/null' ] || [ "$file2" == '\\.\nul' ] || [ ! -e "$file2" ]
then
file2="/tmp/gitnull"
`echo "">$file2`
fi
echo diff : $1 -- $2
"C:\Program files (x86)\WinMerge\WinMergeU.exe" -e -ub -dl "Base" -dr "Mine" "$file1" "$file2"
fondamentalmente bash tiene conto di quando il risultato del diff in un file vuoto e crea un nuovo file temporaneo nella posizione corretta.
Ho trovato due modi per configurare " SourceGear DiffMerge " come difftool e mergetool in github Windows.
I seguenti comandi in una finestra del prompt dei comandi aggiorneranno il tuo .gitconfig per configurare GIT usando DiffMerge:
git config --global diff.tool diffmerge
git config --global difftool.diffmerge.cmd 'C:/Program\ Files/SourceGear/Common/DiffMerge/sgdm.exe \"$LOCAL\" \"$REMOTE\"'
git config --global merge.tool diffmerge
git config --global mergetool.diffmerge.cmd 'C:/Program\ Files/SourceGear/Common/DiffMerge/sgdm.exe -merge -result=\"$MERGED\" \"$LOCAL\" \"$BASE\" \"$REMOTE\"'
[ o ]
Aggiungi le seguenti righe al tuo .gitconfig. Questo file dovrebbe trovarsi nella directory home in C: \ Users \ UserName:
[diff]
tool = diffmerge
[difftool "diffmerge"]
cmd = C:/Program\\ Files/SourceGear/Common/DiffMerge/sgdm.exe \"$LOCAL\" \"$REMOTE\"
[merge]
tool = diffmerge
[mergetool "diffmerge"]
trustExitCode = true
cmd = C:/Program\\ Files/SourceGear/Common/DiffMerge/sgdm.exe -merge -result=\"$MERGED\" \"$LOCAL\" \"$BASE\" \"$REMOTE\"
Potresti voler aggiungere anche queste opzioni:
git config --global merge.tool p4mergetool
git config --global mergetool.p4merge.cmd 'p4merge $BASE $LOCAL $REMOTE $MERGED'
git config --global mergetool.p4mergetool.trustExitCode false
git config --global mergetool.keepBackup false
Inoltre, non so perché ma la citazione e la barra della risposta di Milan Gardian mi hanno rovinato le cose.
Se qualcuno vuole usare gvim come strumento diff su TortoiseGit, questo è ciò che è necessario inserire nell'input di testo per il percorso dello strumento diff esterno:
path\to\gvim.exe -f -d -c "wincmd R" -c "wincmd R" -c "wincmd h" -c "wincmd J"
Per IntelliJ IDEA (Community Edition) configurazione get mergetool a 3 vie in ambiente Windows (~/.gitconfig
)
Cygwin
[mergetool "ideamerge"]
cmd = C:/Program\\ Files\\ \\(x86\\)/JetBrains/IntelliJ\\ IDEA\\ Community\\ Edition\\ 14.1.3/bin/idea.exe merge `cygpath -wa $LOCAL` `cygpath -wa $REMOTE` `cygpath -wa $BASE` `cygpath -wa $MERGED`
[merge]
tool = ideamerge
Msys
[mergetool "ideamerge"]
cmd = "/c/Program\\ Files\\ \\(x86\\)/JetBrains/IntelliJ\\ IDEA\\ Community\\ Edition\\ 14.1.3/bin/idea.exe" merge `~/winpath.sh $LOCAL` `~/winpath.sh $REMOTE` `~/winpath.sh $BASE` `~/winpath.sh $MERGED`
[merge]
tool = ideamerge
Il ~ / winpath.sh è di convertire i percorsi in Windows su msys ed è tratto da domanda di conversione del percorso msys su stackoverflow
#! /bin/sh
function wpath {
if [ -z "$1" ]; then
echo "$@"
else
if [ -f "$1" ]; then
local dir=$(dirname "$1")
local fn=$(basename "$1")
echo "$(cd "$dir"; echo "$(pwd -W)/$fn")" | sed 's|/|\\|g';
else
if [ -d "$1" ]; then
echo "$(cd "$1"; pwd -W)" | sed 's|/|\\|g';
else
echo "$1" | sed 's|^/\(.\)/|\1:\\|g; s|/|\\|g';
fi
fi
fi
}
wpath "$@"
Per configurare p4merge, installato usando chocolatey su Windows sia per unire che per diff, dai un'occhiata qui: https://gist.github.com/CamW/88e95ea8d9f0786d746a
Se riscontri problemi nell'apertura di p4merge da SourceTree, cerca il tuo file di configurazione locale denominato config in MyRepo.git ed elimina qualsiasi configurazione di unione. Nel mio caso stava cercando di aprire Meld che ho appena disinstallato