startet jetzt WinMerge.
Wenn Sie git diffWinMerge starten möchten , stellen Sie einfach Folgendes ein:
set GIT_EXTERNAL_DIFF=winmerge.sh
Der eigentliche Mehrwert ergibt sich jedoch aus der Möglichkeit, mit demselben Diff-Tool alle Unterschiede in einem Stapel darzustellen, anstatt sie nacheinander darzustellen, sodass Sie die Diff-Tool-Fenster einzeln schließen müssen.
Update Juni 2012 (zweieinhalb Jahre später):
Der Vergleich von Verzeichnissen anstelle von Datei für Datei wird in Kürze verfügbar sein:
Siehe [ANNOUNCE] Git 1.7.11.rc1 :
" git difftool" lernte die --dir-diffOption " ", externe Diff-Tools zu erzeugen , die nach dem Auffüllen von zwei temporären Verzeichnissen zwei Verzeichnishierarchien gleichzeitig vergleichen können , anstatt eine Instanz des externen Tools einmal pro Dateipaar auszuführen .
#!/bin/sh
git diff --name-only "$@" | while read filename; do
git difftool "$@" --no-prompt "$filename" &
done
Dies funktioniert jedoch nur durch Öffnen von n Fenstern für n Dateien (wenn Sie versuchen, die -sOption WinMerge zu verwenden, funktioniert dies nicht, da die temporären Dateien vom Difftool zu früh gelöscht werden).
Aus diesem Grund gefällt mir der Ansatz von GitDiff.bat - Power-Diffing mit GI , mit dem Sie die Liste der Dateien mit einem Unterschied überprüfen können, bevor Sie eine auswählen, um die internen Unterschiede zu untersuchen.
Ich habe es so angepasst, dass nur DOS-Befehle verwendet werden
@echo off
setlocal
if "%1" == "-?" (
echo GitDiff - enables diffing of file lists, instead of having to serially
echo diff files without being able to go back to a previous file.
echo Command-line options are passed through to git diff.
echo If GIT_FOLDER_DIFF is set, it is used to diff the file lists. Default is windff.
goto END
)
if "%GIT_DIFF_COPY_FILES%"=="" (
rd /s /q %TEMP%\GitDiff
mkdir %TEMP%\GitDiff
mkdir %TEMP%\GitDiff\old
mkdir %TEMP%\GitDiff\new
REM This batch file will be called by git diff. This env var indicates whether it is
REM being called directly, or inside git diff
set GIT_DIFF_COPY_FILES=1
set GIT_DIFF_OLD_FILES=%TEMP%\GitDiff\old
set GIT_DIFF_NEW_FILES=%TEMP%\GitDiff\new
set GIT_EXTERNAL_DIFF=%~dp0\GitDiff.bat
echo Please wait and press q when you see "(END)" printed in reverse color...
call git diff %*
if defined GIT_FOLDER_DIFF (
REM This command using GIT_FOLDER_DIFF just does not work for some reason.
%GIT_FOLDER_DIFF% %TEMP%\GitDiff\old %TEMP%\GitDiff\new
goto END
)
if exist "%ProgramFiles%\Beyond Compare 2\BC2.exe" (
set GIT_FOLDER_DIFF="%ProgramFiles%\Beyond Compare 2\BC2.exe"
"%ProgramFiles%\Beyond Compare 2\BC2.exe" %TEMP%\GitDiff\old %TEMP%\GitDiff\new
goto END
)
"%ProgramFiles(x86)%\WinMerge\WinMergeU.exe" -r -e -dl "Local" -dr "Remote" %TEMP%\GitDiff\old %TEMP%\GitDiff\new
goto END
)
REM diff is called by git with 7 parameters:
REM path old-file old-hex old-mode new-file new-hex new-mode
copy %TEMP%\%~nx2 %GIT_DIFF_OLD_FILES%\%1
copy %5 %GIT_DIFF_NEW_FILES%
:END
Es ist nicht robust genug, um Dateien mit demselben Namen in verschiedenen Verzeichnissen zu verarbeiten, gibt Ihnen jedoch eine allgemeine Vorstellung davon, was möglich ist:
Hier wird nur ein WinMerge geöffnet, wobei die Liste der Dateien interne Unterschiede aufweist. Sie können auf diejenigen klicken, die Sie untersuchen möchten. Anschließend ESCwird die gesamte WinMerge-diffSitzung durch eine einfache Sitzung geschlossen.
Wenn Sie dies mit der Git-Version 1.6.5.1.1367.gcd48 versuchen, werden anscheinend keine Dateien in diesen temporären Ordnern generiert. Irgendwelche Ideen, wo man nach dem Problem suchen kann? Vielen Dank!
Art
@Art: In diesen Debug-Fällen versuche ich, das Problem durch Vereinfachung des Skripts zu isolieren: 1 / Wenn das Skript mit dem Parameter 7 aufgerufen wird (erster Durchgang von git diff, um die Dateien zu kopieren) 2 / Ist das Skript zumindest zurückgerufen am Ende des git diff?
VonC
1
@Erik: Bezüglich der Option -ubsiehe die WinMerge-FAQ : Es ist dasselbe wie -u: Es weist WinMerge an, die Dateien nicht zur MRU hinzuzufügen.
VonC
1
@Erik: Sie sollten einen Vergleich der Dateien in c:\Temp\GitDiff\oldund sehen c:\Temp\GitDiff\new, nicht ' /tmp'. Sind Sie sicher, dass Sie dieses DOS-Programm von einer DOS-Sitzung (und nicht von einer Bash-Sitzung) ausführen?
VonC
1
@coffeemakr hat es ""in meinem Fall nicht ausgewertet (Ausführen des git configBefehls von einem Windows-CMD. Aber Sie haben Recht: Es würde ausgewertet, ""wenn von einer Bash-Shell ausgeführt.
VonC
19
Ich hatte Probleme, den ersten Teil an zwei Stellen zu verwenden, und habe ihn wie folgt behoben
Der zweite Befehl zum Einrichten von winmerge.cmd erforderte einen zusätzlichen Schrägstrich in cmdline (vor $ LOCAL und $ REMOTE), andernfalls ersetzte cygwin die Variable in cmdline
Ich habe genau das getan, was VonC angewiesen hat, aber ich habe leere Argumente in meinem Skript winmerge.sh erhalten. Die Verwendung zusätzlicher Schrägstriche löste das Problem. Danke dir!
Ashagi
6
Da der Thread verwirrend und gegabelt wird, finden Sie hier konsolidierte Anweisungen für die WinMerge-Methode "--dir-diff" für msysgit Git Windows.
Schritt 1 - Erstellen Sie eine Datei mit dem Namen winmerge.sh an einem Ort, auf den Ihr Pfad zugreifen kann (z. B. /home/bin/winmerge.sh), mit folgendem Inhalt.
Schritt 2 - Geben Sie die folgenden Befehle in Git Bash ein, um git anzuweisen, winmerge.sh als difftool zu verwenden (diese Optionen werden in /home/.gitconfig gespeichert):
Schritt 3 - Jetzt können Sie testen, indem Sie den folgenden Befehl in Git Bash eingeben, um Ihr WinMerge-Diff zu starten:
git difftool --dir-diff
Schritt 4 - Für einen schnelleren Zugriff erstellen Sie einen Alias für diesen Befehl, indem Sie diese Zeile zu .bashrc in Ihrem Basisordner hinzufügen (oder erstellen Sie eine .bashrc-Datei mit dieser Zeile, wenn die Datei noch nicht vorhanden ist):
alias diffdir='git difftool --dir-diff'
Schritt 5 - Jetzt können Sie schnell einen Unterschied in WinMerge erkennen, indem Sie den folgenden Befehl in Git Bash eingeben
Es wäre hilfreich, wenn jemand die Bedeutung von $LOCALund erklären würde $REMOTE.
Tola Odejayi
6
Ich habe ein Skript, das die Diff- und Merge-Tools in der Git-Konfiguration mit den richtigen Parametern festlegt, für die keine separate .sh-Datei erforderlich ist. Es scheint gut für mich zu funktionieren.
Der folgende Befehl hat bei mir nicht funktioniert. git config --global difftool.winmerge.cmd "\"\$PROGRAMFILES\"/WinMerge/WinMergeU.exe -r -u -e -dl \"Local\" -dr \"Remote\" \"\$LOCAL\" \"\$REMOTE\"" Hinweis: Dieser Befehl muss an einer Eingabeaufforderung und nicht an der Powershell ausgeführt werden. Das manuelle Hinzufügen von Folgendem zu meinem [difftool "winmerge"]Abschnitt .gitconfig hat bei mir funktioniert: cmd = 'C:/Program Files (x86)/WinMerge/WinMergeU.exe' -r -u -e -dl \"Local\" -dr \"Remote\" \"$LOCAL\" \"$REMOTE\"
Josh
1
Es hat nicht funktioniert, aber mit einigen Änderungen funktioniert es: Öffnen Sie cmd als Administrator und führen Sie Folgendes aus : git config --global mergetool.winmerge.cmd "\"C:\Program Files (x86)\WinMerge\WinMergeU.exe\" -r -u -e -dl \"Local\" -dr \"Remote\" \"$LOCAL\" \"$REMOTE\" \"$BASE\" \"$MERGED\"". Es gab ein paar falsche Escape-Zeichenfolgen (beachten Sie einige zusätzliche unerwünschte Backslashes direkt vor dem $- ich denke, Sie $müssen nicht maskiert werden). Auch fehlte ein Ende "danach WinMergeU?.exe. Laufen Sie, um git config --get mergetool.winmerge.cmdzu sehen, was tatsächlich eingestellt wurde. Trotzdem danke für die Nicht- .shVersion: +1!
Falsarella
5
Unter Windows können Sie dies folgendermaßen tun:
1) Öffnen Sie die .gitconfig-Datei. Es befindet sich in Ihrem Home-Verzeichnis: c: \ users \ username.gitconfig
2) Fügen Sie die folgenden Zeilen hinzu. Achten Sie auf die einfachen Anführungszeichen, die den Weg zum Winmerge einschließen:
Achten Sie auch auf die Vorwärts- Schrägstriche statt Schrägstriche in dem Befehlspfad.
wisbucky
5
Ohne Konfiguration:
git difftool --tool winmerge
Angenommen:
Winmerge ist installiert
Git für Windows wird ab "git Version 2.12.0.windows1" oder höher installiert (obwohl frühere Versionen von git den Befehl möglicherweise eingeführt haben).
Ich war verwirrt darüber, warum die Lösung als DOS-Batchdatei präsentiert wurde, da meine Git-Installation mit einer Bash-Shell geliefert wurde. Ich konnte auch keinen DOS-Kontext aus Bash ausführen, daher habe ich versucht, das anzupassen, was zuvor in einem Bash-Kontext geteilt wurde.
Da git diffder angegebene Befehl für jede Datei einmal ausgeführt zu werden scheint, habe ich meine Lösung in zwei Bash-Skripte aufgeteilt:
Konfigurieren Sie gitprepdiff.shzunächst das Difftool wie zuvor erwähnt
Ich habe auch festgestellt, dass die Ergebnisse der git configureBefehle direkt in gefunden und bearbeitet werden könnenC:\Users\<username>\.gitconfigure
gitdiff.sh wird dann in der Befehlszeile ausgeführt, in der Sie normalerweise anrufen würden git diff
Erwähnenswert ist auch, dass bei meiner Installation /tmp(in Bash) %LOCALAPPDATA%\Temp\1\(in Windows) zugeordnet wurde. Deshalb verwende ich letzteres in meinem Aufruf von WinMerge.
Es scheint lächerlich, durch so viele Reifen zu springen, damit dies funktioniert, aber es funktioniert. Sie erhalten alle Dateiunterschiede auf einmal, wie es sein sollte. Ich musste auch die von @dobau erwähnten Änderungen vornehmen, um Dateien in Unterverzeichnissen richtig zu behandeln.
Antworten:
Update Juni 2015, 6 Jahre später:
Wie in " git mergetool winmerge " beschrieben, wird ein einfaches
git config diff.tool winmerge
ausreichen.Git 2.5+ (Q2, 2015) kennt Winmerge jetzt als Diff- oder Merge-Tool!
Ursprüngliche Antwort (2009-2012)
(msysgit, 1.6.5, DOS-Sitzung)
Der erste Teil (mit Winmerge) wird unter " Wie kann ich die 'Git Diff'-Ausgabe mit dem Visual Diff-Programm anzeigen? " Beschrieben.
Mit
winmerge.sh
in einem Verzeichnis gespeicherten Teil IhresPATH
:(Siehe WinMerge-Befehlszeilenoptionen. )
startet jetzt WinMerge.
Wenn Sie
git diff
WinMerge starten möchten , stellen Sie einfach Folgendes ein:Der eigentliche Mehrwert ergibt sich jedoch aus der Möglichkeit, mit demselben Diff-Tool alle Unterschiede in einem Stapel darzustellen, anstatt sie nacheinander darzustellen, sodass Sie die Diff-Tool-Fenster einzeln schließen müssen.
Update Juni 2012 (zweieinhalb Jahre später):
Der Vergleich von Verzeichnissen anstelle von Datei für Datei wird in Kürze verfügbar sein:
Siehe [ANNOUNCE] Git 1.7.11.rc1 :
Weitere Informationen finden Sie unter " Patch
difftool
:difftool
Lernen, mit Verzeichnisunterschieden umzugehen " und in der Antwort " Verzeichnisvergleich von Git-Zweigen ".Original Difftool nach Verzeichnisskript (Dezember 2009)
Wie Seba Illingworth in seiner Antwort erwähnt , kann ein Skript git-diffall.sh (ebenfalls in den Pfad eingefügt) genau das tun:
Dies funktioniert jedoch nur durch Öffnen von n Fenstern für n Dateien (wenn Sie versuchen, die
-s
Option WinMerge zu verwenden, funktioniert dies nicht, da die temporären Dateien vom Difftool zu früh gelöscht werden).Aus diesem Grund gefällt mir der Ansatz von GitDiff.bat - Power-Diffing mit GI , mit dem Sie die Liste der Dateien mit einem Unterschied überprüfen können, bevor Sie eine auswählen, um die internen Unterschiede zu untersuchen.
Ich habe es so angepasst, dass nur DOS-Befehle verwendet werden
Es ist nicht robust genug, um Dateien mit demselben Namen in verschiedenen Verzeichnissen zu verarbeiten, gibt Ihnen jedoch eine allgemeine Vorstellung davon, was möglich ist:
Hier wird nur ein WinMerge geöffnet, wobei die Liste der Dateien interne Unterschiede aufweist. Sie können auf diejenigen klicken, die Sie untersuchen möchten. Anschließend ESCwird die gesamte
WinMerge-diff
Sitzung durch eine einfache Sitzung geschlossen.quelle
git diff
?-ub
siehe die WinMerge-FAQ : Es ist dasselbe wie-u
: Es weist WinMerge an, die Dateien nicht zur MRU hinzuzufügen.c:\Temp\GitDiff\old
und sehenc:\Temp\GitDiff\new
, nicht '/tmp
'. Sind Sie sicher, dass Sie dieses DOS-Programm von einer DOS-Sitzung (und nicht von einer Bash-Sitzung) ausführen?""
in meinem Fall nicht ausgewertet (Ausführen desgit config
Befehls von einem Windows-CMD. Aber Sie haben Recht: Es würde ausgewertet,""
wenn von einer Bash-Shell ausgeführt.Ich hatte Probleme, den ersten Teil an zwei Stellen zu verwenden, und habe ihn wie folgt behoben
Der zweite Befehl zum Einrichten von winmerge.cmd erforderte einen zusätzlichen Schrägstrich in cmdline (vor $ LOCAL und $ REMOTE), andernfalls ersetzte cygwin die Variable in cmdline
Die Datei winmerge.sh wurde in geändert (ohne dies wurde der Fehler "Pfad rechts ungültig" angezeigt).
quelle
Da der Thread verwirrend und gegabelt wird, finden Sie hier konsolidierte Anweisungen für die WinMerge-Methode "--dir-diff" für msysgit Git Windows.
Schritt 1 - Erstellen Sie eine Datei mit dem Namen winmerge.sh an einem Ort, auf den Ihr Pfad zugreifen kann (z. B. /home/bin/winmerge.sh), mit folgendem Inhalt.
Schritt 2 - Geben Sie die folgenden Befehle in Git Bash ein, um git anzuweisen, winmerge.sh als difftool zu verwenden (diese Optionen werden in /home/.gitconfig gespeichert):
Schritt 3 - Jetzt können Sie testen, indem Sie den folgenden Befehl in Git Bash eingeben, um Ihr WinMerge-Diff zu starten:
Schritt 4 - Für einen schnelleren Zugriff erstellen Sie einen Alias für diesen Befehl, indem Sie diese Zeile zu .bashrc in Ihrem Basisordner hinzufügen (oder erstellen Sie eine .bashrc-Datei mit dieser Zeile, wenn die Datei noch nicht vorhanden ist):
Schritt 5 - Jetzt können Sie schnell einen Unterschied in WinMerge erkennen, indem Sie den folgenden Befehl in Git Bash eingeben
quelle
$LOCAL
und erklären würde$REMOTE
.Ich habe ein Skript, das die Diff- und Merge-Tools in der Git-Konfiguration mit den richtigen Parametern festlegt, für die keine separate .sh-Datei erforderlich ist. Es scheint gut für mich zu funktionieren.
Hinweis - Der gesamte .cmd-Teil wird in Anführungszeichen gesetzt, damit die Parameter in der .gitconfig ordnungsgemäß aufgelistet werden
quelle
git config --global difftool.winmerge.cmd "\"\$PROGRAMFILES\"/WinMerge/WinMergeU.exe -r -u -e -dl \"Local\" -dr \"Remote\" \"\$LOCAL\" \"\$REMOTE\""
Hinweis: Dieser Befehl muss an einer Eingabeaufforderung und nicht an der Powershell ausgeführt werden. Das manuelle Hinzufügen von Folgendem zu meinem[difftool "winmerge"]
Abschnitt .gitconfig hat bei mir funktioniert:cmd = 'C:/Program Files (x86)/WinMerge/WinMergeU.exe' -r -u -e -dl \"Local\" -dr \"Remote\" \"$LOCAL\" \"$REMOTE\"
git config --global mergetool.winmerge.cmd "\"C:\Program Files (x86)\WinMerge\WinMergeU.exe\" -r -u -e -dl \"Local\" -dr \"Remote\" \"$LOCAL\" \"$REMOTE\" \"$BASE\" \"$MERGED\""
. Es gab ein paar falsche Escape-Zeichenfolgen (beachten Sie einige zusätzliche unerwünschte Backslashes direkt vor dem$
- ich denke, Sie$
müssen nicht maskiert werden). Auch fehlte ein Ende"
danachWinMergeU?.exe
. Laufen Sie, umgit config --get mergetool.winmerge.cmd
zu sehen, was tatsächlich eingestellt wurde. Trotzdem danke für die Nicht-.sh
Version: +1!Unter Windows können Sie dies folgendermaßen tun:
1) Öffnen Sie die .gitconfig-Datei. Es befindet sich in Ihrem Home-Verzeichnis: c: \ users \ username.gitconfig
2) Fügen Sie die folgenden Zeilen hinzu. Achten Sie auf die einfachen Anführungszeichen, die den Weg zum Winmerge einschließen:
quelle
Ohne Konfiguration:
Angenommen:
quelle
Ich war verwirrt darüber, warum die Lösung als DOS-Batchdatei präsentiert wurde, da meine Git-Installation mit einer Bash-Shell geliefert wurde. Ich konnte auch keinen DOS-Kontext aus Bash ausführen, daher habe ich versucht, das anzupassen, was zuvor in einem Bash-Kontext geteilt wurde.
Da
git diff
der angegebene Befehl für jede Datei einmal ausgeführt zu werden scheint, habe ich meine Lösung in zwei Bash-Skripte aufgeteilt:Konfigurieren Sie
gitprepdiff.sh
zunächst das Difftool wie zuvor erwähntIch habe auch festgestellt, dass die Ergebnisse der
git configure
Befehle direkt in gefunden und bearbeitet werden könnenC:\Users\<username>\.gitconfigure
gitdiff.sh
wird dann in der Befehlszeile ausgeführt, in der Sie normalerweise anrufen würdengit diff
Erwähnenswert ist auch, dass bei meiner Installation
/tmp
(in Bash)%LOCALAPPDATA%\Temp\1\
(in Windows) zugeordnet wurde. Deshalb verwende ich letzteres in meinem Aufruf von WinMerge.quelle
gitprepdiff.sh
für#!/bin/sh #echo ...gitprepdiff.sh mkdir -vp "$TMP/GitDiff/old/$(dirname $2)" cp -v $1 "$TMP/GitDiff/old/$2" cp -v --parents $2 "$TMP/GitDiff/new"
Danke geändert !Gemäß dem WinMerge-Befehlszeilenhandbuch : "Den Parametern wird entweder ein Schrägstrich (/) oder ein Bindestrich (-) vorangestellt."
quelle