используйте Winmerge в Мерзавце для регистрации разности

Существует ли способ использовать Winmerge в мерзавце, чтобы сделать Diffs?

97
задан Toby Allen 30 December 2012 в 17:23
поделиться

1 ответ

Обновление от июня 2015 года, 6 лет спустя:

Как подробно описано в « git mergetool winmerge », простой git config diff.tool winmerge будет достаточно.

Git 2.5+ (2 квартал 2015 г.) теперь знает Winmerge как инструмент сравнения или слияния!


Исходный ответ (2009-2012)

(msysgit, 1.6.5, сеанс DOS)

Первая часть (с использованием Winmerge) описана в разделе « Как просмотреть вывод 'git diff' с помощью программы визуального сравнения? »

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

С winmerge.sh , хранящимся в часть каталога вашего PATH :

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

(см. Параметры командной строки WinMerge )

git difftool

теперь запускает WinMerge.
Если вы хотите, чтобы git diff запускал WinMerge, просто установите:

set GIT_EXTERNAL_DIFF=winmerge.sh

Но реальная добавленная стоимость заключается в возможности использовать тот же инструмент сравнения, чтобы вместо этого отображать все различия в одном пакете представления их последовательно, вынуждая вас закрывать окна инструментов сравнения по одному файлу.

Обновление от июня 2012 г. (два с половиной года спустя):

Сравнение каталогов вместо файлов по -файл скоро будет доступен:
См. [ОБЪЯВЛЕНИЕ] Git 1.7.11.rc1 :

« git difftool » изучил параметр « - dir-diff » для создания внешнего сравнения инструменты, которые могут сравнивать две иерархии каталогов за один раз после заполнения двух временных каталогов, вместо запуска экземпляра внешнего инструмента один раз для каждой пары файлов .

См. " ] Патч difftool : научите difftool обрабатывать различия каталогов »и ответ« Сравнение каталогов веток Git »для получения дополнительных сведений.


Исходный сценарий difftool по каталогам (декабрь 2009 г.)

Как Себа Иллингворт упоминает в своем ответе , сценарий git-diffall.sh (также помещенный в путь) может сделать именно это :

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

Но это работает только при открытии окон n для файлов n (если вы попытаетесь использовать параметр -s WinMerge, он не будет работать, потому что из-за слишком раннего удаления временных файлов программой difftool)


Вот почему мне нравится подход GitDiff.bat - power-diffing with GI , который позволяет просматривать список файлов с различие, прежде чем выбрать один, чтобы изучить его внутренние различия.
прежде чем выбрать один, чтобы изучить его внутренние различия.
прежде чем выбрать один, чтобы изучить его внутренние различия.
Я настроил его, чтобы использовать только команды DOS

@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

. Он недостаточно надежен для обработки файлов с одинаковыми именами в разных каталогах, но дает вам общее представление о том, что возможно:
Здесь откроется только один WinMerge со списком файлов, имеющих внутренние отличия. Вы можете щелкнуть те, которые хотите изучить, и простой ESC закроет все сеансы WinMerge-diff .

112
ответ дан 24 November 2019 в 05:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: