Verwenden Sie Winmerge innerhalb von Git, um diff zu archivieren

Lesezeit: 10 Minuten

Verwenden Sie Winmerge innerhalb von Git um diff zu archivieren
eiu165

Gibt es eine Möglichkeit, Winmerge innerhalb von Git zu verwenden, um Diffs zu machen?

  • Siehe stackoverflow.com/questions/636253/…

    – Ben James

    10. Dezember 2009 um 15:11 Uhr

  • Verwandter Beitrag – So konfigurieren Sie ein Diff-Tool in Git im Allgemeinen.

    – RBT

    5. April 2018 um 23:48 Uhr

Verwenden Sie Winmerge innerhalb von Git um diff zu archivieren
VonC

Update Juni 2015, 6 Jahre später:

Wie in “git mergetool winmerge” beschrieben, ist eine einfache git config diff.tool winmerge wird genug sein.

Git 2.5+ (Q2, 2015) kennt jetzt Winmerge als Diff- oder Merge-Tool!


Ursprüngliche Antwort (2009-2012)

(msysgit, 1.6.5, DOS-Sitzung)

Der erste Teil (unter Verwendung von winmerge) wird in „Wie zeige ich die Ausgabe von ‚git diff‘ mit dem Visual Diff-Programm an?“ 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

Mit winmerge.sh in einem Verzeichnisteil von Ihnen gespeichert PATH:

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

(sehen WinMerge-Befehlszeilenoptionen)

git difftool

startet nun WinMerge.
Falls Sie es wollen git diff Um WinMerge zu starten, stellen Sie einfach Folgendes ein:

set GIT_EXTERNAL_DIFF=winmerge.sh

Aber der wirkliche Mehrwert ergibt sich aus der Möglichkeit, dasselbe Diff-Tool zu verwenden Präsentieren Sie alle Unterschiede in einem Batch Anstatt sie nacheinander anzuzeigen, müssen Sie die Diff-Tool-Fenster jeweils eine Datei schließen.

Aktualisierung Juni 2012 (zweieinhalb Jahre später):

Das Vergleichen von Verzeichnissen anstelle von Datei für Datei wird bald verfügbar sein:
Sehen [ANNOUNCE] Git 1.7.11.rc1:

git difftool„gelernt“--dir-diff” Option zum Spawnen externer Diff-Tools, die dies können zwei Verzeichnishierarchien vergleichen gleichzeitig nach dem Auffüllen von zwei temporären Verzeichnissen, anstatt einmal pro Dateipaar eine Instanz des externen Tools auszuführen.

Sehen “Patch difftool: unterrichten difftool um Verzeichnisunterschiede zu behandeln“ und die Antwort „Verzeichnisvergleich von Git-Branches“ für weitere Details.


Ursprüngliches Difftool von Directories Script (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:

#!/bin/sh
git diff --name-only "$@" | while read filename; do
    git difftool "$@" --no-prompt "$filename" &
done

Das geht aber nur durch öffnen n Fenster für n Dateien (wenn Sie versuchen, die -s Option von WinMerge, es funktioniert nicht, weil die temporären Dateien zu früh vom Difftool gelöscht werden)


Deshalb gefällt mir der Ansatz von GitDiff.bat – Power-Diffing mit GImit dem Sie die Liste der Dateien mit einem Unterschied überprüfen können, bevor Sie eine auswählen, um ihre 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 handhaben, 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 die, die Sie untersuchen möchten, dann einfach anklicken ESC wird das alles schließen WinMerge-diff Sitzung.

  • 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? Danke!

    – Kunst

    16. September 2010 um 4:18 Uhr

  • @Art: In diesen Debug-Fällen versuche ich, das Problem zu isolieren, indem ich das Skript vereinfache: 1/ wenn das Skript mit dem Parameter 7 aufgerufen wird (erster Durchgang von git diff, um die Dateien zu kopieren) 2/ wird das Skript zumindest zurückgerufen am Ende von git diff?

    – VonC

    16. September 2010 um 4:24 Uhr

  • @Erik: bezüglich der Option -ubsiehe die WinMerge-FAQ: es ist das gleiche als -u: Es weist WinMerge an, die Dateien nicht zur MRU hinzuzufügen.

    – VonC

    23. November 2010 um 4:53 Uhr

  • @Erik: Sie sollten den Vergleich der Dateien in sehen c:\Temp\GitDiff\old und c:\Temp\GitDiff\newnicht ‘/tmp‘. Sind Sie sicher, dass Sie dieses DOS-Programm von einer DOS-Sitzung aus ausführen (und nicht von einer Bash-Sitzung)?

    – VonC

    23. November 2010 um 4:57 Uhr

  • @coffeemakr hat es nicht ausgewertet "" in meinem Fall (Ausführen der git config Befehl von einer Windows-CMD. Aber du hast recht: es wäre zu werten "" wenn es von einer Bash-Shell ausgeführt wird.

    – VonC

    18. Juni 2018 um 17:53 Uhr

Ich hatte Probleme mit dem ersten Teil an 2 Stellen und habe es wie folgt behoben

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

    C:\myGitRepo>git config --replace --global difftool.winmerge.cmd "winmerge.sh \"\$LOCAL\" \"\$REMOTE\""
    
  2. änderte die Datei winmerge.sh in (ohne dies wurde der Fehler Right-Path-Invalid angezeigt)

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

  • Ich habe genau das getan, was VonC angewiesen hat, aber ich habe leere Argumente in meinem winmerge.sh-Skript erhalten. Die Verwendung zusätzlicher Schrägstriche löste das Problem. Danke!

    – Ashagi

    16. November 2011 um 10:02 Uhr

Ich habe ein Skript, das die Diff- und Merge-Tools in der Git-Konfiguration mit den richtigen Parametern einstellt, für die keine separate .sh-Datei vorhanden sein muss. Bei mir scheint es gut 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\""

Notiz – Der gesamte .cmd-Teil wird in Anführungszeichen gesetzt, damit die Parameter in der .gitconfig richtig aufgelistet werden

  • 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 von einer Eingabeaufforderung und nicht von Powershell ausgeführt werden. Manuelles Hinzufügen des Folgenden zu meiner .gitconfig [difftool "winmerge"] Abschnitt hat für mich funktioniert: cmd = 'C:/Program Files (x86)/WinMerge/WinMergeU.exe' -r -u -e -dl \"Local\" -dr \"Remote\" \"$LOCAL\" \"$REMOTE\"

    – Josch

    13. Mai 2015 um 19:43 Uhr


  • 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-Strings (beachten Sie ein paar zusätzliche unerwünschte Backslashes dort direkt vor dem $ – Ich schätze $ müssen nicht entkommen werden). Außerdem fehlte ein Ende " nach dem WinMergeU?.exe. Laufen git config --get mergetool.winmerge.cmd um zu sehen, was tatsächlich eingestellt wurde. Wie auch immer, danke fürs Nichts .sh Fassung: +1!

    – Falsarella

    19. Juni 2015 um 0:20 Uhr

1646307490 17 Verwenden Sie Winmerge innerhalb von Git um diff zu archivieren
Robertcollier4

Da der Thread verwirrend und verzweigt wird, finden Sie hier konsolidierte Anweisungen für die WinMerge-Methode „–dir-diff“ der Verzeichnisliste für msysgit Git Windows.

Schritt 1 – Erstellen Sie eine Datei namens winmerge.sh an einem Ort, auf den Ihr Pfad zugreifen kann (z. B. /home/bin/winmerge.sh) 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 Home-Ordner hinzufügen (oder erstellen Sie eine .bashrc-Datei mit dieser Zeile, wenn die Datei noch nicht existiert):

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

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

diffdir

Ohne Konfiguration:

git difftool --tool winmerge

Angenommen:

  • Winmerge ist installiert
  • Git für Windows ist ab „git version 2.12.0.windows1“ oder höher installiert (obwohl frühere Git-Versionen den Befehl möglicherweise eingeführt haben).

  • Danke, das ist die einfachste Lösung

    – code4j

    5. Januar 2018 um 10:05 Uhr

Unter Windows kannst du das so machen:

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

  • Danke, das ist die einfachste Lösung

    – code4j

    5. Januar 2018 um 10:05 Uhr

1646307491 334 Verwenden Sie Winmerge innerhalb von Git um diff zu archivieren
Shawn Süd

Ich war verwirrt darüber, warum die Lösung als DOS-Batch-Datei präsentiert wurde, da meine Git-Installation mit einer Bash-Shell geliefert wurde. Ich war auch nicht in der Lage, einen DOS-Kontext von Bash aus auszuführen, also habe ich versucht, das anzupassen, was zuvor in einem Bash-Kontext geteilt wurde.

Seit git diff den angegebenen Befehl für jede Datei einmal auszuführen scheint, habe ich meine Lösung in zwei Bash-Skripte aufgeteilt:

Zuerst konfigurieren gitprepdiff.sh das Difftool sein, 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 festgestellt, dass die Ergebnisse der git configure Befehle können direkt in gefunden und bearbeitet werden C:\Users\<username>\.gitconfigure

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

#!/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 "$@" | while read filename; do
    git difftool "$@" --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 bei meiner Installation /tmp (in bash) zugeordnet %LOCALAPPDATA%\Temp\1\ (in Windows), deshalb verwende ich letzteres in meinem Aufruf an WinMerge.

  • ich habe mich verändert gitprepdiff.sh zum #!/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!

    – Dobau

    27. März 2013 um 20:47 Uhr


  • Scheint lächerlich, durch so viele Reifen zu springen, um dies zum Laufen zu bringen, aber es funktioniert. Sie erhalten alle Datei-Diffs auf einmal, wie es sein sollte. Ich musste auch die von @dobau erwähnten Änderungen vornehmen, um Dateien in Unterverzeichnissen richtig zu behandeln.

    – Tom

    25. September 2013 um 0:07 Uhr

922980cookie-checkVerwenden Sie Winmerge innerhalb von Git, um diff zu archivieren

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy