Существует ли способ использовать Winmerge в мерзавце, чтобы сделать Diffs?
Обновление от июня 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
.