Git unter Windows: Wie stellen Sie eine mergetool up?
Frage
Ich habe msysGit und Git auf Cygwin versucht. Beide arbeiten ganz gut an und für sich und beide laufen gitk und git-gui perfekt.
Nun, wie zum Teufel konfiguriere ich einen mergetool? (Vimdiff arbeitet auf Cygwin, vorzugsweise aber würde Ich mag etwas ein wenig benutzerfreundlicher für einige unserer Windows-liebenden Mitarbeiter.)
Lösung
Antwort auf Follow-up auf Charles Bailey, hier ist mein git Setup, das p4merge (freie Querplattform 3Way Merge-Tool); getestet auf msys Git (Windows) installieren:
git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"'
oder von einem Fenster cmd.exe Schale, die zweite Zeile wird:
git config --global mergetool.p4merge.cmd "p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\""
Die Änderungen (in Bezug auf Charles Bailey):
- hinzugefügt, um globale git Config, das heißt gültig für alle git Projekte nicht nur die aktuell
- das Anpassungs-Tool Konfigurations Wert befindet sich in "mergetool. [Werkzeug] .cmd", nicht "merge. [Werkzeug] .cmd" (dumm von mir, verbrachte Fehlerbehebung eine Stunde warum git beschweren gehalten über nicht vorhandene Werkzeug)
- hinzugefügt doppelte Anführungszeichen für alle Dateinamen, so dass Dateien mit Leerzeichen noch durch das Merge-Tool gefunden werden kann (Getestet habe ich diese in msys Git von Powershell)
- beachten Sie, dass Perforce wird standardmäßig die Installation dir hinzufügen PATH, so dass keine Notwendigkeit vollständigen Pfad angeben, in dem Befehl p4merge
Download: http: //www.perforce. com / product / components / notgedrungen Vision-Merge-and-diff-Tools
Bearbeiten (Feb 2014)
Wie von @Gregory Pakosz , neueste msys git jetzt "nativ" unterstützt p4merge (getestet auf 1.8.5.2.msysgit.0 ).
Sie können die Liste der unterstützten Tools angezeigt werden, indem Sie:
git mergetool --tool-help
Sie sollten sehen p4merge in entweder verfügbar oder gültig Liste. Falls nicht, aktualisieren Sie bitte Ihre git.
Wenn p4merge wurde gezeigt als verfügbar , ist es in Ihrem PATH und Sie setzen müssen merge.tool :
git config --global merge.tool p4merge
Wenn es aufgeführt wurde als gültig , müssen Sie definieren mergetool.p4merge.path neben merge.tool :
git config --global mergetool.p4merge.path c:/Users/my-login/AppData/Local/Perforce/p4merge.exe
- Das oben ist ein Beispiel Pfad, wenn p4merge für den aktuellen Benutzer installiert wurde, nicht systemweit (benötigt keine Administratorrechte oder UAC)
- Obwohl
~
dem aktuellen Benutzer-Home-Verzeichnis (so in der Theorie sollte der Weg sein~/AppData/Local/Perforce/p4merge.exe
) erweitern sollte dies nicht für mich arbeiten - Auch wäre besser gewesen Vorteil einer Umgebungsvariablen zu übernehmen (zB
$LOCALAPPDATA/Perforce/p4merge.exe
), git scheint nicht erweitert Umgebungsvariablen für Pfade zu sein (wenn Sie wissen, wie diese Funktion zu erhalten, wenden Sie sich bitte lassen Sie mich diese Antwort wissen oder aktualisieren)
Andere Tipps
Einstellung mergetool.p4merge.cmd nicht mehr funktionieren wird seit Git begonnen hat versucht p4merge, zu unterstützen siehe libexec / git-core / git-mergetool--lib.so brauchen wir nur für git den mergetool Pfad angeben, zum Beispiel die p4merge:
git config --global mergetool.p4merge.path 'C:\Program Files\Perforce\p4merge.exe'
git config --global merge.tool p4merge
Dann wird es funktionieren.
Ich bin mit Tragbarer Git auf WinXP (funktioniert ein Genuss!) Und benötigt einen Konflikt zu lösen, die in Verzweigung kam. Von allen GUIs habe ich geprüft, KDiff3 erwies sich die transparent zu verwenden sein.
Aber ich fand die Anweisungen, die ich brauchte, um es in Windows in diese Blog-Post , Anweisungen, die hier ein wenig von den anderen Ansätzen aufgeführten abweichen. Es belief sich im Grunde diese Zeilen meiner .gitconfig
-Datei hinzufügen:
[merge]
tool = kdiff3
[mergetool "kdiff3"]
path = C:/YourPathToBinaryHere/KDiff3/kdiff3.exe
keepBackup = false
trustExitCode = false
Arbeiten gut jetzt!
Unter Cygwin, die nur , was für mich gearbeitet ist wie folgt vor:
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)"'
Auch Ich mag die schnelle Nachricht für difftool deaktivieren:
git config --global difftool.prompt false
git mergetool
ist vollständig konfigurierbar, so dass Sie ziemlich viel können Sie Ihre Lieblings-Tool gewählt haben.
Die vollständige Dokumentation ist hier: http: // www.kernel.org/pub/software/scm/git/docs/git-mergetool.html
Kurz gesagt, können Sie eine Standard mergetool gesetzt, indem der Benutzer Konfigurationsvariable merge.tool
Einstellung.
Wenn das Merge-Tool einer von denen nativ von ihr unterstützt ist, dass Sie nur mergetool.<tool>.path
auf den vollständigen Pfad zu dem Werkzeug eingestellt haben (ersetzen <tool>
durch das, was Sie merge.tool
konfiguriert haben zu sein.
Sie können aber mergetool.<tool>.cmd
auf ein kleines Shell gesetzt eval'ed zur Laufzeit werden mit den Shell-Variablen auf die entsprechenden Dateien eingestellt $BASE, $LOCAL, $REMOTE, $MERGED
. Sie haben ein bisschen vorsichtig mit der Flucht sein, ob Sie direkt eine Konfigurationsdatei bearbeiten oder die Variable mit dem git config
Befehl gesetzt.
So etwas sollte den Geschmack von dem, 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"'
Wenn Sie Setup Ihre Lieblings-Merge-Tool haben, ist es einfach eine Frage der laufenden git mergetool
, wenn Sie Konflikte zu lösen.
Das p4merge Tool von Perforce ist ein ziemlich gutes Standalone-Merge-Tool.
Für unvergleichbar auf Windows 7
git config --global merge.tool bc3
git config --global mergetool.bc3.path "C:\Program Files (x86)\Beyond Compare 3\BCompare.exe"
Es scheint, dass neuere Versionen unterstützen git p4merge direkt, also
git config --global merge.tool p4merge
sollte alles, was Sie brauchen, wenn p4merge.exe auf dem Weg ist. Keine Notwendigkeit zur Einrichtung cmd oder Pfad.
Ich hatte die extra fallen unter Angabe mit msysGit auf Windows 7, nicht sicher, warum.
git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge $BASE $LOCAL $REMOTE $MERGED'
Wenn Sie dies durch 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`'
Bah, das schließlich für mich gearbeitet (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\")
Dank vorherige Plakate für die Spitze cygpath zu verwenden!
Ich verwende eine App namens WinMerge ( http://winmerge.org/ ) Informationen aus ihrem Handbuch ( http://manual.winmerge.org/CommandLine.html )
Dies ist der Bash-Skript i von der mergetool
Richtlinie über .gitconfig
verwenden
#!/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"
im Grunde die bash entfallen, wenn das Ergebnis des diff in einer leeren Datei und erstellt eine neue temporäre Datei an der richtigen Stelle.
Ich fand zwei Arten zu konfigurieren " SourceGear DiffMerge ", wie difftool und mergetool in Github von Windows.
Die folgenden Befehle in einem Eingabeaufforderungsfenster wird aktualisiert Ihre .gitconfig GIT Verwendung 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 die folgenden Zeilen zu Ihrer .gitconfig. Diese Datei sollte in Ihrem Home-Verzeichnis in C: \ Users \ Benutzername:
[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\"
Sie können diese Optionen hinzufügen möchten auch:
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
Auch ich weiß nicht, warum, aber das Zitat und Slash von Milan Gardian Antwort geschraubt Dingen für mich.
Wenn jemand verwenden Gvim als Diff-Tool auf TortoiseGit will, dann ist es das, was Sie in die Texteingabe für den Pfad zum externen Diff-Tool eingeben müssen:
path\to\gvim.exe -f -d -c "wincmd R" -c "wincmd R" -c "wincmd h" -c "wincmd J"
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
Das ~ / winpath.sh ist Pfad zu Windows auf msys konvertieren und genommen wird von msys Wegwandlung Frage auf 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 "$@"
Zur Einrichtung p4merge installiert chocolatey mit auf Fenster für beide verschmelzen und diff, hier einen Blick: https://gist.github.com/CamW/88e95ea8d9f0786d746a
Wenn Sie Probleme beim Öffnen p4merge aus SourceTree sucht Sie lokale Konfigurationsdatei mit dem Namen Konfiguration unter MyRepo.git und löschen Sie alle Merge-Konfiguration. In meinem Fall wurde versucht, es Meld zu öffnen, die gerade deinstalliert ich