wake-up-neo.com

verwenden Sie Winmerge innerhalb von Git, um die Datei zu diff

Gibt es eine Möglichkeit, Winmerge innerhalb von git für Diffs zu verwenden? 

96
eiu165

Update Juni 2015, 6 Jahre später:

Wie in " git mergetool winmerge " beschrieben, reicht ein einfacher git config diff.tool winmerge aus.

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 (unter Verwendung von winmerge) wird unter " Wie kann ich die Ausgabe von" git diff "mit dem Programm" visual diff "anzeigen? " beschrieben.

C:\myGitRepo>git config --replace --global diff.tool winmerge
C:\myGitRepo>git config --replace --global difftool.winmerge.cmd "winmerge.sh \"$LOCAL\" \"$REMOTE\""
C:\myGitRepo>git config --replace --global difftool.Prompt false

Wenn winmerge.sh in einem Verzeichnisteil Ihres PATHnamens__ gespeichert ist:

#!/bin/sh
echo Launching WinMergeU.exe: $1 $2
"$PROGRAMFILES/WinMerge/WinMergeU.exe" -e -u -dl "Local" -dr "Remote" "$1" "$2"

(Siehe WinMerge-Befehlszeilenoptionen )

git difftool

startet jetzt WinMerge.
Wenn Sie möchten, dass git diff WinMerge startet, stellen Sie einfach Folgendes ein:

set GIT_EXTERNAL_DIFF=winmerge.sh

Der eigentliche Mehrwert ergibt sich jedoch aus der Möglichkeit, dasselbe Diff-Tool zu verwenden, um alle Unterschiede in einem Stapel darzustellen anstatt sie nacheinander darzustellen, wodurch Sie gezwungen sind, die Diff-Tool-Fenster nacheinander zu schließen.

pdate Juni 2012 (zweieinhalb Jahre später):

Das Vergleichen von Verzeichnissen anstelle von Datei-für-Datei wird in Kürze verfügbar sein:
Siehe [ANNOUNCE] Git 1.7.11.rc1 :

"git difftool" hat die Option "--dir-diff" kennengelernt, mit der externe Diff-Tools erstellt werden können, die zwei Verzeichnishierarchien vergleichen zu einem Zeitpunkt nach dem Auffüllen von zwei temporären Verzeichnissen anstatt eine Instanz des externen Tools einmal auszuführen pro Dateipaar.

Weitere Informationen finden Sie unter "Patch difftoolname__: Teach difftoolfür Verzeichnisunterschiede" und in der Antwort " Verzeichnisvergleich von Git-Zweigen ".


Original Difftool von Directories Script (Dezember 2009)

Wie Seba Illingworth in seiner Antwort erwähnt, kann ein Skript git-diffall.sh (auch in den Pfad gestellt) genau das tun:

#!/bin/sh
git diff --name-only "[email protected]" | while read filename; do
    git difftool "[email protected]" --no-Prompt "$filename" &
done

Dies funktioniert jedoch nur, indem n Fenster für n Dateien geöffnet werden (wenn Sie versuchen, die Option -s von WinMerge zu verwenden, wird dies nicht der Fall sein arbeiten, weil die temporären Dateien vom difftool zu früh gelöscht wurden)


Aus diesem Grund gefällt mir der Ansatz von GitDiff.bat - machtunterschiedlich 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 optimiert, um nur DOS-Befehle zu verwenden

@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, aber es gibt Ihnen 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, und dann auf eine einfache ESC schließt die all WinMerge-diff-Sitzung.

112
VonC

Ich hatte Probleme mit dem ersten Teil an zwei Stellen und reparierte es wie folgt

  1. Der zweite Befehl zum Einrichten von winmerge.cmd erforderte einen zusätzlichen Schrägstrich in cmdline (vor $ LOCAL und $ REMOTE), ansonsten ersetzte cygwin die Variable in cmdline

    C:\myGitRepo>git config --replace --global difftool.winmerge.cmd "winmerge.sh \"\$LOCAL\" \"\$REMOTE\""
    
  2. die Datei winmerge.sh wurde geändert in (ohne dies wurde ein ungültiger Fehler auf dem rechten Pfad ausgegeben).

    #!/bin/sh
    echo Launching WinMergeU.exe: "$(cygpath -aw "$1")" "$(cygpath -aw "$2")"
    "$PROGRAMFILES/WinMerge/WinMergeU.exe" -e -ub -dl "Base" -dr "Mine" "$(cygpath -aw "$1")" "$(cygpath -aw "$2")"
    
19
Gopi

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.

git config --global diff.tool winmerge
git config --global difftool.Prompt false
git config --global difftool.winmerge.cmd "\"\$PROGRAMFILES\"/WinMerge/WinMergeU.exe -r -u -e -dl \"Local\" -dr \"Remote\" \"\$LOCAL\" \"\$REMOTE\""

git config --global merge.tool winmerge
git config --global mergetool.Prompt false
git config --global mergetool.winmerge.trustExitCode true
git config --global mergetool.winmerge.cmd "\"\$PROGRAMFILES\"/WinMerge/WinMergeU.exe -r -u -e -dl \"Local\" -dr \"Remote\" \"\$LOCAL\" \"\$REMOTE\" \"\$BASE\" \"\$MERGED\""

Hinweis - Der gesamte .cmd-Teil wird in Anführungszeichen gesetzt, damit die Parameter ordnungsgemäß in der .gitconfig aufgeführt werden

6
Alf47

Da der Thread verwirrend und gegabelt wird, finden Sie hier konsolidierte Anweisungen für die WinMerge-Methode "--dir-diff" für Directory Listing 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), und zwar mit folgendem Inhalt.

#!/bin/sh
echo Launching WinMergeU.exe: $1 $2
"$PROGRAMFILES/WinMerge/WinMergeU.exe" -r -ub -dl "Remote" -dr "Local" "$1" "$2"

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

git config --replace --global diff.tool winmerge
git config --replace --global difftool.winmerge.cmd "winmerge.sh \"$LOCAL\" \"$REMOTE\""
git config --replace --global difftool.Prompt false

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 - Erstellen Sie für einen schnelleren Zugriff 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, falls die Datei noch nicht vorhanden ist):

alias diffdir='git difftool --dir-diff'

Schritt 5 - Jetzt können Sie einen Unterschied in WinMerge schnell erkennen, indem Sie den folgenden Befehl in Git Bash eingeben

diffdir
6
robertcollier4

Ohne Konfiguration:

git difftool --tool winmerge

Vorausgesetzt:

  • Winmerge ist installiert
  • Git für Windows ist ab "git Version 2.12.0.windows1" oder höher installiert (obwohl frühere Versionen von git möglicherweise den Befehl eingeführt haben).
2
John Bentley

Unter Windows können Sie es so machen:

1) Öffnen Sie die .gitconfig-Datei. Es befindet sich in Ihrem Heimatverzeichnis: c:\users\username.gitconfig

2) Fügen Sie die Zeilen unten hinzu. Achten Sie auf die einfachen Anführungszeichen, die den Pfad zu winmerge umschließen:

[diff]
    tool = winmerge
[difftool "winmerge"]
    cmd = "'C:/Program Files (x86)/WinMerge/WinMergeU.exe'" -e "$LOCAL" "$REMOTE"
[difftool]
    Prompt = false
[merge]
    tool = winmerge
[mergetool "winmerge"]
    cmd = "'C:/Program Files (x86)/WinMerge/WinMergeU.exe'" \"$MERGED\" \"$REMOTE\"
[mergetool]
    keepBackup = false
    trustExitCode = false
2
Caner

Ich war verwirrt, warum die Lösung als DOS-Batchdatei präsentiert wurde, da meine Git-Installation mit einer Bash-Shell kam. Ich konnte auch keinen DOS-Kontext von bash ausführen, daher habe ich versucht, das anzupassen, was zuvor in einem bash-Kontext freigegeben wurde.

Da git diff den angegebenen Befehl einmal für jede Datei auszuführen scheint, teile ich meine Lösung in zwei Bash-Skripts auf:

Konfigurieren Sie zunächst gitprepdiff.sh als Difftool, wie zuvor erwähnt

#!/bin/sh
#echo ...gitprepdiff.sh
cp -v $1 "$TMP/GitDiff/old/$2"
cp -v $2 "$TMP/GitDiff/new"

Ich habe auch bemerkt, dass die Ergebnisse der git configure-Befehle direkt in C:\Users\<username>\.gitconfigure gefunden und bearbeitet werden können.

gitdiff.sh wird dann in der Befehlszeile ausgeführt, in der Sie normalerweise git diff aufrufen würden.

#!/bin/sh
#echo Running gitdiff.sh...

DIFFTEMP=$TMP/GitDiff

echo Deleting and re-creating $DIFFTEMP...
rm -rf $DIFFTEMP;
mkdir $DIFFTEMP;

echo Creating $DIFFTEMP/old...
mkdir $DIFFTEMP/old;

echo Creating $DIFFTEMP/new...
mkdir $DIFFTEMP/new;

git diff --name-only "[email protected]" | while read filename; do
    git difftool "[email protected]" --no-Prompt "$filename";
done

"$PROGRAMFILES\WinMerge\WinMergeU.exe" -r -e -dl "Repository" -dr "Working" $LOCALAPPDATA\\Temp\\1\\GitDiff\\old $LOCALAPPDATA\\Temp\\1\\GitDiff\\new

Erwähnenswert ist auch, dass /tmp (in bash) bei meiner Installation %LOCALAPPDATA%\Temp\1\ (in Windows) zugeordnet ist. Deswegen verwende ich letzteres in meinem Aufruf von WinMerge.

2
Shawn South
git config --global diff.tool winmerge
git config --global difftool.winmerge.cmd "\"$PROGRAMFILES\\WinMerge\\WinMergeU.exe\" -u -dl \"Local\" -dr \"Remote\" \"\$LOCAL\" \"\$REMOTE\""
git config --global difftool.Prompt false

Laut dem WinMerge-Befehlszeilenhandbuch : "Den Parametern wird entweder ein Schrägstrich (/) oder ein Bindestrich (-) vorangestellt"

1
Steve Lang