it-swarm.com.de

Git unter Windows: Wie richte ich ein Mergetool ein?

Ich habe versucht, msysGit und Git auf Cygwin. Beide funktionieren einwandfrei und beide laufen perfekt mit Gitk und Git-Gui.

Wie zum Teufel konfiguriere ich nun ein Mergetool? (Vimdiff arbeitet mit Cygwin, aber für einige unserer Windows-liebenden Kollegen hätte ich am liebsten etwas benutzerfreundlicheres.)

336
Jake

Um die Antwort von Charles Bailey weiterzuverfolgen, ist hier mein Git-Setup, das p4merge (kostenloses plattformübergreifendes 3-Wege-Merge-Tool) verwendet. Getestet auf msys Git (Windows) Installation:

git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"'

oder in einer Windows Cmd.exe-Shell wird die zweite Zeile zu:

git config --global mergetool.p4merge.cmd "p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\""

Die Änderungen (relativ zu Charles Bailey):

  • zur globalen Git-Konfiguration hinzugefügt, d. h. gültig für alle Git-Projekte, nicht nur für das aktuelle
  • der benutzerdefinierte Tool-Konfigurationswert befindet sich in "mergetool. [tool] .cmd" und nicht in "merge. [tool] .cmd".
  • doppelte Anführungszeichen für alle Dateinamen hinzugefügt, damit Dateien mit Leerzeichen weiterhin vom Merge-Tool gefunden werden können (ich habe dies in msys Git von Powershell getestet)
  • beachten Sie, dass Perforce standardmäßig das Installationsverzeichnis zu PATH hinzufügt, sodass im Befehl kein vollständiger Pfad zu p4merge angegeben werden muss

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


[~ # ~] bearbeiten [~ # ~] (Feb 2014)

Wie von @ Gregory Pakosz hervorgehoben, unterstützt msys git jetzt "nativ" p4merge ( getestet auf 1.8.5.2.msysgit.0).

Sie können die Liste der unterstützten Tools anzeigen, indem Sie Folgendes ausführen:

git mergetool --tool-help

Sie sollten p4merge entweder in available oder valid auflisten. Wenn nicht, aktualisieren Sie bitte Ihr Git.

Wenn p4merge als available aufgeführt wurde, befindet es sich in Ihrem [~ # ~] Pfad [~ # ~] und Sie müssen nur merge.tool einstellen:

git config --global merge.tool p4merge

Wenn es als gültig aufgeführt wurde, müssen Sie mergetool.p4merge.path zusätzlich zu merge.tool definieren:

git config --global mergetool.p4merge.path c:/Users/my-login/AppData/Local/Perforce/p4merge.exe
  • Das Obige ist ein Beispielpfad, als p4merge für den aktuellen Benutzer installiert wurde, nicht systemweit (erfordert keine Administratorrechte oder UAC-Erhöhung).
  • Obwohl ~ In das Home-Verzeichnis des aktuellen Benutzers erweitert werden sollte (theoretisch sollte der Pfad also ~/AppData/Local/Perforce/p4merge.exe Lauten), hat dies bei mir nicht funktioniert
  • Noch besser wäre es gewesen, eine Umgebungsvariable zu nutzen (z. B. $LOCALAPPDATA/Perforce/p4merge.exe). Git scheint Umgebungsvariablen für Pfade nicht zu erweitern (wenn Sie wissen, wie dies funktioniert, lassen Sie es mich wissen oder aktualisieren Sie es Antworten)
296
Milan Gardian

das Setzen von mergetool.p4merge.cmd funktioniert nicht mehr, seit Git versucht, p4merge zu unterstützen. Siehe libexec/git-core/git-mergetool--lib.so müssen wir nur den mergetool-Pfad für git angeben, zum Beispiel p4merge:

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

Dann wird es funktionieren.

87
daizuozhuo

Ich verwende Portable Git unter WinXP (das funktioniert!) Und musste einen Konflikt lösen, der bei der Verzweigung auftrat. Von allen Guis, die ich überprüft habe, erwies sich KDiff als am transparentesten zu verwenden.

Aber ich fand die Anweisungen, die ich brauchte, um es in Windows zum Laufen zu bringen, in diesem Blog-Beitrag , Anweisungen, die sich geringfügig von den anderen hier aufgeführten Ansätzen unterscheiden. Es war im Grunde genommen das Hinzufügen dieser Zeilen zu meinem .gitconfig Datei:

[merge]
    tool = kdiff3

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

Jetzt gut arbeiten!

58
Dɑvïd

Unter Cygwin hat nur Folgendes bei mir funktioniert:

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

Außerdem möchte ich die Eingabeaufforderungsnachricht für difftool deaktivieren:

git config --global difftool.Prompt false
20
splicer

git mergetool Ist vollständig konfigurierbar, sodass Sie so ziemlich Ihr Lieblingswerkzeug auswählen können.

Die vollständige Dokumentation finden Sie hier: http://www.kernel.org/pub/software/scm/git/docs/git-mergetool.html

Kurz gesagt, Sie können ein Standard-Mergetool festlegen, indem Sie die Benutzerkonfigurationsvariable merge.tool Festlegen.

Wenn das Zusammenführungswerkzeug eines der von ihm ursprünglich unterstützten ist, müssen Sie nur mergetool.<tool>.path Auf den vollständigen Pfad zum Werkzeug setzen (ersetzen Sie <tool> Durch das, was Sie konfiguriert haben merge.tool sein.

Andernfalls können Sie mergetool.<tool>.cmd Auf ein Shell-Bit setzen, das zur Laufzeit ausgewertet werden soll, indem Sie die Shell-Variablen $BASE, $LOCAL, $REMOTE, $MERGED Auf die entsprechenden Dateien setzen. Sie müssen mit dem Escapezeichen vorsichtig sein, ob Sie eine Konfigurationsdatei direkt bearbeiten oder die Variable mit dem Befehl git config Setzen.

So etwas sollte den Geschmack dessen vermitteln, was Sie tun können ('mymerge' ist ein fiktives Werkzeug).

git config merge.tool mymerge
git config merge.mymerge.cmd 'mymerge.exe --base "$BASE" "$LOCAL" "$REMOTE" -o "$MERGED"'

Sobald Sie Ihr bevorzugtes Merge-Tool eingerichtet haben, müssen Sie nur noch git mergetool Ausführen, wenn Sie Konflikte lösen müssen.

Das p4merge-Tool von Perforce ist ein ziemlich gutes eigenständiges Merge-Tool.

16
CB Bailey

Für unvergleichlich unter Windows 7

git config --global merge.tool bc3
git config --global mergetool.bc3.path "C:\Program Files (x86)\Beyond Compare 3\BCompare.exe"
7
developer747

Es scheint, dass neuere Git-Versionen p4merge direkt unterstützen, also

git config --global merge.tool p4merge

sollte alles sein, was Sie brauchen, wenn p4merge.exe auf Ihrem Weg ist. Keine Notwendigkeit, cmd oder Pfad einzurichten.

6
friederbluemle

Wie bereits hier (und hier und hier ) beantwortet, ist mergetool der Befehl, um dies zu konfigurieren. Für ein nettes grafisches Frontend empfehle ich kdiff (GPL).

5
hlovdal

Ich musste das zusätzliche Zitat mit msysGit auf Windows 7 fallen lassen, nicht sicher warum.

git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge $BASE $LOCAL $REMOTE $MERGED'
4
Mike Glenn

ich benutze eine App namens WinMerge ( http://winmerge.org/ ) Informationen aus ihrem Handbuch ( http://manual.winmerge.org/CommandLine.html )

dies ist das Bash-Skript, das ich aus der Direktive mergetool über .gitconfig verwende.

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

grundsätzlich berücksichtigt die Bash das Ergebnis des Diffs in einer leeren Datei und erstellt eine neue temporäre Datei am richtigen Ort.

3
xero

Bah, das endlich hat bei mir funktioniert (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\")

Vielen Dank an die bisherigen Poster für den Tipp, cygpath zu nutzen!

3
Nathan McDaniel

Wenn Sie dies über cygwin tun, müssen Sie möglicherweise cygpath verwenden:

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
idbrii

Ich habe zwei Möglichkeiten gefunden, "SourceGear DiffMerge" als difftool und mergetool in github Windows zu konfigurieren.

Die folgenden Befehle in einem Eingabeaufforderungsfenster aktualisieren Ihre .gitconfig-Datei, um GIT mithilfe von DiffMerge zu konfigurieren:

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

[ ODER ]

Fügen Sie Ihrer .gitconfig die folgenden Zeilen hinzu. Diese Datei sollte sich in Ihrem Ausgangsverzeichnis unter C:\Users\UserName befinden:

[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\"
2
vineel

Für IntelliJ IDEA (Community Edition) 3-Wege-Git-Mergetool-Konfiguration in Windows-Umgebung (~/.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

Die Datei ~/winpath.sh dient zum Konvertieren von Pfaden nach Windows unter msys und wird von Frage zur Konvertierung von msys-Pfaden bei Stackoverflow übernommen

#! /bin/sh                                                               

function wpath {                                                         
    if [ -z "$1" ]; then                                                 
        echo "[email protected]"                                                        
    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 "[email protected]" 
1
Usman Saleem

Möglicherweise möchten Sie auch diese Optionen hinzufügen:

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

Ich weiß auch nicht warum, aber das Zitat und der Schrägstrich aus Milan Gardians Antwort haben die Dinge für mich durcheinander gebracht.

1
Roberto

Wenn jemand gvim als Diff-Tool für TortoiseGit verwenden möchte, müssen Sie Folgendes in die Texteingabe für den Pfad zum externen Diff-Tool eingeben:

path\to\gvim.exe -f -d -c "wincmd R" -c "wincmd R" -c "wincmd h" -c "wincmd J"
1
Attila Szeremi

Wenn Sie Probleme beim Öffnen von p4merge in SourceTree haben, suchen Sie unter MyRepo.git nach der lokalen Konfigurationsdatei config und löschen Sie alle Zusammenführungskonfigurationen. In meinem Fall hat es versucht, Meld zu öffnen, das ich gerade deinstalliert habe

0
Kautsky Lozano

Schauen Sie hier nach, um p4merge einzurichten, das mit chocolatey unter Windows für Merge und Diff installiert wurde: https://Gist.github.com/CamW/88e95ea8d9f0786d746a

0
CamW