теперь запустит WinMerge.
Если вы хотите git diffзапустить WinMerge, просто установите:
set GIT_EXTERNAL_DIFF=winmerge.sh
Но реальная добавленная стоимость заключается в возможности использовать тот же инструмент сравнения, чтобы представить все различия в одном пакете. вместо того, чтобы представлять их последовательно, вынуждая вас закрывать окна инструмента сравнения по одному файлу за раз.
Обновление июнь 2012 г. (два с половиной года спустя):
" git difftool" изучил " --dir-diff" возможность создания внешних инструментов сравнения, которые могут сравнивать две иерархии каталогов одновременно после заполнения двух временных каталогов, вместо того , чтобы запускать экземпляр внешнего инструмента один раз для каждой пары файлов .
Оригинальный скрипт 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 - дифференциация мощности с 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сессию.
Пробуем это с git версии 1.6.5.1.1367.gcd48, и похоже, что в этих временных папках не создаются файлы. Есть идеи, где искать проблему? Спасибо!
Art
@Art: в этих случаях отладки я пытаюсь изолировать проблему, упрощая сценарий: 1 / если сценарий, вызываемый с параметром 7 (первый проход git diff, для копирования файлов) 2 / является сценарием, по крайней мере, обратным вызовом в конце git diff?
VonC
1
@Erik: относительно этой опции -ubсм. WinMerge FAQ : это то же самое, что -u: он сообщает WinMerge не добавлять файлы в MRU.
VonC
1
@Erik: вы должны увидеть сравнение файлов в c:\Temp\GitDiff\oldи c:\Temp\GitDiff\new, а не ' /tmp'. Вы уверены, что выполняете эту программу DOS из сеанса DOS (а не из сеанса bash)?
VonC
1
@coffeemakr, ""в моем случае он не оценивался (выполнение git configкоманды из Windows CMD. Но вы правы: он будет оцениваться, ""если выполняется из оболочки bash.
VonC
19
Я столкнулся с проблемой использования первой части в 2-х местах и исправил ее следующим образом
Вторая команда для настройки winmerge.cmd требовала дополнительной косой черты на cmdline (до $ LOCAL и $ REMOTE), иначе cygwin подставлял переменную в cmdline
Я сделал именно так, как велел VonC, но получал пустые аргументы в моем скрипте winmerge.sh. Использование дополнительных слэшей решило проблему. Спасибо!
ashagi
6
Поскольку поток становится запутанным и раздваивается, вот сводные инструкции для метода WinMerge списка каталогов "--dir-diff" для msysgit Git Windows.
Шаг 1. Создайте файл с именем winmerge.sh в месте, доступном для вашего пути (например, /home/bin/winmerge.sh) со следующим содержимым.
Шаг 2 - Введите следующие команды в Git Bash, чтобы указать git использовать winmerge.sh в качестве инструмента diff (эти параметры сохраняются в /home/.gitconfig):
Шаг 3 - Теперь вы можете протестировать, введя следующую команду в Git Bash, чтобы запустить ваш WinMerge diff:
git difftool --dir-diff
Шаг 4 - Для более быстрого доступа создайте псевдоним для этой команды, добавив эту строку в .bashrc в вашей домашней папке (или создайте файл .bashrc с этой строкой, если файл еще не существует):
alias diffdir='git difftool --dir-diff'
Шаг 5 - Теперь вы можете быстро увидеть разницу в WinMerge, просто набрав следующую команду в Git Bash
Было бы полезно, если бы кто-нибудь объяснил значение $LOCALи $REMOTE.
Tola Odejayi 08
6
У меня есть сценарий, который установит инструменты Diff и Merge в конфигурации Git с соответствующими параметрами, которые не требуют существования отдельного файла .sh. У меня вроде нормально работает.
Следующая команда у меня не сработала. git config --global difftool.winmerge.cmd "\"\$PROGRAMFILES\"/WinMerge/WinMergeU.exe -r -u -e -dl \"Local\" -dr \"Remote\" \"\$LOCAL\" \"\$REMOTE\"" Примечание: эту команду необходимо запускать из командной строки, а не из PowerShell. Ручное добавление следующего в мой [difftool "winmerge"]раздел .gitconfig сработало для меня: cmd = 'C:/Program Files (x86)/WinMerge/WinMergeU.exe' -r -u -e -dl \"Local\" -dr \"Remote\" \"$LOCAL\" \"$REMOTE\"
Джош,
1
Это не сработало, но с некоторыми изменениями, он работает: открытый CMD от имени администратора и выполнить команду: git config --global mergetool.winmerge.cmd "\"C:\Program Files (x86)\WinMerge\WinMergeU.exe\" -r -u -e -dl \"Local\" -dr \"Remote\" \"$LOCAL\" \"$REMOTE\" \"$BASE\" \"$MERGED\"". Было несколько неправильных экранированных строк (обратите внимание на несколько дополнительных нежелательных обратных косых черт прямо перед $- я думаю $, экранировать не нужно). Кроме того, не было конца "после WinMergeU?.exe. Беги git config --get mergetool.winmerge.cmdпосмотреть, что было на самом деле установлено. В любом случае, спасибо за не .shверсию: +1!
falsarella
5
В Windows это можно сделать так:
1) Откройте файл .gitconfig. Он находится в вашем домашнем каталоге: c: \ users \ username.gitconfig
2) Добавьте строки ниже. Обратите внимание на одинарные кавычки, заключающие путь к winmerge:
Также стоит обратить внимание на передние косые черты вместо обратных косых черт в пути команды.
wisbucky
5
Без конфигурации:
git difftool --tool winmerge
Предполагая:
Winmerge установлен
Устанавливается Git для Windows, начиная с «git версии 2.12.0.windows1» или выше (хотя в более ранних версиях git эта команда могла быть представлена).
Я был смущен тем, почему решение было представлено в виде пакетного файла DOS, поскольку моя установка Git шла с оболочкой bash. Мне также не удалось запустить контекст DOS из bash, поэтому я попытался адаптировать то, что ранее использовалось в контексте bash.
Поскольку git diffкажется, что указанная команда запускается один раз для каждого файла, я разделил свое решение на два сценария bash:
Во-первых, сконфигурируйте gitprepdiff.shкак difftool, как упоминалось ранее
Также стоит отметить, что в моей установке /tmp(в bash) сопоставлено %LOCALAPPDATA%\Temp\1\(в Windows), поэтому я использую последний при вызове WinMerge.
Кажется смешным перепрыгивать через столько обручей, чтобы справиться с этой задачей, но это так. Вы получаете все различия файлов за один раз, как и должно быть. Мне также пришлось внести изменения, упомянутые @dobau, чтобы правильно обрабатывать файлы в подкаталогах.
Ответы:
Обновление в июне 2015 года, 6 лет спустя:
Как подробно описано в « git mergetool winmerge », достаточно простого
git config diff.tool winmerge
.Git 2.5+ (второй квартал 2015 г.) теперь знает Winmerge как инструмент сравнения или слияния!
Оригинальный ответ (2009-2012)
(msysgit, 1.6.5, сеанс DOS)
Первая часть (с использованием Winmerge) описана в разделе « Как просмотреть вывод 'git diff' с помощью программы визуального сравнения? »
В
winmerge.sh
каталоге хранится часть вашегоPATH
:(см. параметры командной строки WinMerge )
теперь запустит WinMerge.
Если вы хотите
git diff
запустить WinMerge, просто установите:Но реальная добавленная стоимость заключается в возможности использовать тот же инструмент сравнения, чтобы представить все различия в одном пакете. вместо того, чтобы представлять их последовательно, вынуждая вас закрывать окна инструмента сравнения по одному файлу за раз.
Обновление июнь 2012 г. (два с половиной года спустя):
Скоро будет доступно сравнение каталогов вместо файлового сравнения:
см. [ОБЪЯВЛЕНИЕ] Git 1.7.11.rc1 :
См. « Патч
difftool
: научитьdifftool
обрабатывать различия каталогов » и ответ « Сравнение каталогов веток Git » для получения более подробной информации.Оригинальный скрипт difftool по каталогам (декабрь 2009 г.)
Как упоминает Себа Иллингворт в своем ответе , сценарий git-diffall.sh (также помещенный в путь) может сделать именно это:
Но это работает только при открытии n окон для n файлов (если вы попытаетесь использовать
-s
опцию WinMerge, это не сработает из-за слишком раннего удаления временных файлов с помощью difftool)Вот почему мне нравится подход GitDiff.bat - дифференциация мощности с GI , которая позволяет вам просмотреть список файлов с различиями, прежде чем выбирать один для изучения его внутренних различий.
Я настроил его, чтобы использовать только команды DOS
Он недостаточно надежен для обработки файлов с одинаковыми именами в разных каталогах, но дает вам общее представление о том, что возможно:
здесь открывается только один WinMerge со списком файлов, имеющих внутренние различия. Вы можете нажать на те, которые хотите исследовать, тогда простой ESCзакроет всю
WinMerge-diff
сессию.источник
git diff
?-ub
см. WinMerge FAQ : это то же самое, что-u
: он сообщает WinMerge не добавлять файлы в MRU.c:\Temp\GitDiff\old
иc:\Temp\GitDiff\new
, а не '/tmp
'. Вы уверены, что выполняете эту программу DOS из сеанса DOS (а не из сеанса bash)?""
в моем случае он не оценивался (выполнениеgit config
команды из Windows CMD. Но вы правы: он будет оцениваться,""
если выполняется из оболочки bash.Я столкнулся с проблемой использования первой части в 2-х местах и исправил ее следующим образом
Вторая команда для настройки winmerge.cmd требовала дополнительной косой черты на cmdline (до $ LOCAL и $ REMOTE), иначе cygwin подставлял переменную в cmdline
изменил файл winmerge.sh на (без этого возникала ошибка неправильного пути)
источник
Поскольку поток становится запутанным и раздваивается, вот сводные инструкции для метода WinMerge списка каталогов "--dir-diff" для msysgit Git Windows.
Шаг 1. Создайте файл с именем winmerge.sh в месте, доступном для вашего пути (например, /home/bin/winmerge.sh) со следующим содержимым.
Шаг 2 - Введите следующие команды в Git Bash, чтобы указать git использовать winmerge.sh в качестве инструмента diff (эти параметры сохраняются в /home/.gitconfig):
Шаг 3 - Теперь вы можете протестировать, введя следующую команду в Git Bash, чтобы запустить ваш WinMerge diff:
Шаг 4 - Для более быстрого доступа создайте псевдоним для этой команды, добавив эту строку в .bashrc в вашей домашней папке (или создайте файл .bashrc с этой строкой, если файл еще не существует):
Шаг 5 - Теперь вы можете быстро увидеть разницу в WinMerge, просто набрав следующую команду в Git Bash
источник
$LOCAL
и$REMOTE
.У меня есть сценарий, который установит инструменты Diff и Merge в конфигурации Git с соответствующими параметрами, которые не требуют существования отдельного файла .sh. У меня вроде нормально работает.
Примечание - вся часть .cmd цитируется, чтобы параметры были правильно указаны в .gitconfig.
источник
git config --global difftool.winmerge.cmd "\"\$PROGRAMFILES\"/WinMerge/WinMergeU.exe -r -u -e -dl \"Local\" -dr \"Remote\" \"\$LOCAL\" \"\$REMOTE\""
Примечание: эту команду необходимо запускать из командной строки, а не из PowerShell. Ручное добавление следующего в мой[difftool "winmerge"]
раздел .gitconfig сработало для меня: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\""
. Было несколько неправильных экранированных строк (обратите внимание на несколько дополнительных нежелательных обратных косых черт прямо перед$
- я думаю$
, экранировать не нужно). Кроме того, не было конца"
послеWinMergeU?.exe
. Бегиgit config --get mergetool.winmerge.cmd
посмотреть, что было на самом деле установлено. В любом случае, спасибо за не.sh
версию: +1!В Windows это можно сделать так:
1) Откройте файл .gitconfig. Он находится в вашем домашнем каталоге: c: \ users \ username.gitconfig
2) Добавьте строки ниже. Обратите внимание на одинарные кавычки, заключающие путь к winmerge:
источник
Без конфигурации:
Предполагая:
источник
Я был смущен тем, почему решение было представлено в виде пакетного файла DOS, поскольку моя установка Git шла с оболочкой bash. Мне также не удалось запустить контекст DOS из bash, поэтому я попытался адаптировать то, что ранее использовалось в контексте bash.
Поскольку
git diff
кажется, что указанная команда запускается один раз для каждого файла, я разделил свое решение на два сценария bash:Во-первых, сконфигурируйте
gitprepdiff.sh
как difftool, как упоминалось ранееЯ также заметил, что результаты
git configure
команд можно найти и отредактировать прямо вC:\Users\<username>\.gitconfigure
gitdiff.sh
затем запускается в командной строке, где вы обычно вызываетеgit diff
Также стоит отметить, что в моей установке
/tmp
(в bash) сопоставлено%LOCALAPPDATA%\Temp\1\
(в Windows), поэтому я использую последний при вызове WinMerge.источник
gitprepdiff.sh
на#!/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"
Спасибо!Согласно руководству по командной строке WinMerge : «Параметры начинаются с символа косой черты (/) или тире (-)».
источник