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.)

È stato utile?

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.

Come già risposto qui (e qui e < a href = "https://stackoverflow.com/questions/161813/how-do-i-fix-merge-conflicts-in-git"> qui ), mergetool è il comando per configurarlo. Per un bel frontend grafico consiglio kdiff3 (GPL).

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top