Git su Windows: come si configura un mergetool?


346

Ho provato msysGit e Git su Cygwin. Entrambi funzionano bene in se stessi ed entrambi eseguono perfettamente gitk e git-gui.

Ora come diamine devo configurare un mergetool? (Vimdiff lavora su Cygwin, ma preferibilmente vorrei qualcosa di un po 'più user-friendly per alcuni dei nostri colleghi amanti di Windows.)



4
Git Extensions ha un'interfaccia utente git che ha uno strumento di fusione abbastanza buono e facile da usare per Windows.
KallDrexx,

Sembra che tu abbia bisogno di TortoiseGit?
Sergei,

Risposte:


304

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 attuale
  • il valore di configurazione dello strumento personalizzato risiede in "mergetool. [tool] .cmd", non in "unisci. [tool] .cmd" (sciocca, ho passato un'ora a risolvere i problemi perché 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

Scarica: http://www.perforce.com/product/components/perforce-visual-merge-and-diff-tools


MODIFICARE (febbraio 2014)

Come sottolineato da @Gregory Pakosz , l'ultimo msys git ora "nativamente" supporta p4merge (testato su 1.8.5.2.msysgit.0 ).

È possibile visualizzare un elenco di 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 quando p4merge è stato installato per l'utente corrente, non a livello di sistema (non richiede diritti di amministratore o elevazione UAC)
  • Anche se ~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 aggiorna questa risposta)

Hmm - provando questo - la prima configurazione funziona bene, la successiva mostra solo il testo di aiuto per git config. Non so perché.
Danny Staple,

1
Capito - quelle citazioni singole mi sembrano sospette. Basta raddoppiare e funzionano.
Danny Staple,

13
l'impostazione mergetool.p4merge.cmdnon funzionerà più da quando Git ha iniziato a provare a supportare p4merge, vedi libexec/git-core/git-mergetool--lib. invece usa direttamentemergetool.p4merge.path
Gregory Pakosz il

5
Ho dovuto mettere il percorso completo e sfuggire alle doppie virgolette:cmd = \""c:/Program Files/TortoiseSVN/bin/TortoiseMerge.exe"\" -base:"$BASE" -theirs:"$REMOTE" -mine:"$LOCAL" -merged:"$MERGED"
Ludovic Kuty

21
Questo l'ha fatto per me: git config --global mergetool.p4merge.cmd '"C:\\Program Files\\Perforce\\p4merge" $BASE $LOCAL $REMOTE $MERGED'su Windows 7
Dan P.

88

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 p4merge:

git config --global mergetool.p4merge.path 'C:\Program Files\Perforce\p4merge.exe'
git config --global merge.tool p4merge

Quindi funzionerà.


1
Funziona anche con Beyond Compare 3. Utilizzare invece il percorso di BComp.exe. Grazie!
Richard Anthony Hein,

4
Mi rendo conto che questo è un vecchio thread, ma non riesco a far funzionare quel percorso. Sono un po 'confuso su come dovrebbe essere evitato il percorso dato l'interazione di cmd / msys ... EDIT Il passaggio a virgolette doppie lo ha risolto!
Rustavore,

Grazie Gitninja! Si noti che è possibile digitare questo in Git Bash, ma se si utilizza il comando Prompt è necessario modificare la virgoletta singola in virgoletta doppia
Hải Phong,

61

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 del blog , istruzioni che differiscono leggermente dagli altri approcci elencati qui. Fondamentalmente equivaleva ad aggiungere queste righe al mio .gitconfigfile:

[merge]
    tool = kdiff3

[mergetool "kdiff3"]
    path = C:/YourPathToBinaryHere/KDiff3/kdiff3.exe
    keepBackup = false
    trustExitCode = false

Funziona bene adesso!


13
sul mio PC Win7, ho dovuto usare path = C:\\Program Files (x86)\\KDiff3\\kdiff3.exe(notare le doppie barre posteriori)
Someone Somewhere

Ho ricevuto un errore del tipo "La combinazione dello strumento diff non è disponibile come 'D: \ software \ melddiff \ Meld.exe'"
Allen Vork,

Sai se c'è una differenza con l'ordine in cui viene aggiunta ogni sezione. Voglio dire, se [unisci] sarebbe dopo [mergetool]?
Samuel,

20

Sotto Cygwin, l' 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

16

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 dell'utente merge.tool .

Se lo strumento di unione è uno di quelli supportati nativamente da esso, devi solo impostare mergetool.<tool>.pathil percorso completo dello strumento (sostituisci <tool>con quello che hai configurato merge.toolper essere.

Altrimenti, è possibile impostare mergetool.<tool>.cmdun po 'di shell da valutare in fase di esecuzione con le variabili della shell $BASE, $LOCAL, $REMOTE, $MERGEDimpostate sui file appropriati. Devi essere un po 'attento all'evasione se modifichi direttamente un file di configurazione o imposti la variabile con il git configcomando.

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 git mergetoologni volta che hai conflitti da risolvere.

Lo strumento p4merge di Perforce è uno strumento di unione autonomo abbastanza buono.


8

Per oltre 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"

2
Ho usato questi comandi ma sto usando WinMerge invece di Beyond Compare.
Brent Keller,

6

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.


Questa è la chiave. Dopo aver installato p4merge e aver impostato mergetool.p4merge.path nella posizione esatta, non ha ancora funzionato. L'aggiunta della cartella di installazione al percorso ha funzionato.
RichardM,

5

Come già risposto qui (e qui e qui ), mergetool è il comando per configurarlo. Per un bel frontend grafico consiglio kdiff3 (GPL).


4

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'

3

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`'

3

Bah, questo finalmente 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 la punta per usare cygpath!


3

utilizzo un'app chiamata WinMerge ( http://winmerge.org/ ) informazioni dal loro manuale ( http://manual.winmerge.org/CommandLine.html )

questo è lo script bash che uso dalla mergetooldirettiva 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 la bash tiene conto di quando il risultato del diff in un file vuoto e crea un nuovo file temporaneo nella posizione corretta.


3

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\"'

[ OR ]

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\"

1

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.


1

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"

1

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

~ / Winpath.sh è per convertire i percorsi in Windows su msys ed è preso dalla 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 "$@" 


0

Se hai problemi ad aprire p4merge da SourceTree cerca il tuo file di configurazione locale chiamato config in MyRepo.git ed elimina qualsiasi configurazione di unione. Nel mio caso stava cercando di aprire Meld che ho appena disinstallato

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.