Как я могу сделать WinMerge моим git mergetool?

Я пытаюсь интегрировать WinMerge с Git, как я видел ранее, в Windows 7 Ultimate.

Я выполнил следующие шаги, но ошибка продолжает появляться, когда я выполняю git mergetool, по умолчанию vimdiff.

Создал файл с именем winmerge.sh в корневом каталоге git: C/Program Files (x86)/Git/ with: WinMergeU - это правильное местоположение.

#!/bin/sh
echo Launching WinMergeU.exe: $1 $2
"C:/Program Files (x86)/WinMerge/WinMergeU.exe" 
git /e /u /dl "Base" /dr "Mine" "$1" "$2"

и использовал следующие команды.

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

Ошибка отображается как:

git config option merge.tool set to unknown tool: winmerge

16 ответов

Вы говорите об инструменте слияния, но вы (и некоторые другие люди с ответами) настраиваете его как инструмент сравнения.

Чтобы настроить инструмент слияния, вам нужно использовать merge.tool а также mergetool конфигурации вместо diff.tool а также difftool, как это:

git config --global merge.tool winmerge
git config --replace --global mergetool.winmerge.cmd "\"C:\Program Files (x86)\WinMerge\WinMergeU.exe\" -e -u -dl \"Base\" -dr \"Mine\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\""
git config --global mergetool.prompt false

И тогда вы можете использовать

git mergetool

который откроет вам два файла для редактирования.

Престижность для @dvdvck, упомянув в комментариях, что в параметрах командной строки вы можете указать третий файл для файла результатов для winmerge (параметр outputpath).

Для полноты, я упомяну, что есть также эта суть, нацеленная на полную настройку winmerge как для diff, так и для инструмента слияния.

Если вы решите использовать SourceTree (или для любого поисковика Google с SourceTree), вы можете использовать WinMerge для инструмента слияния, установив инструмент слияния на пользовательский, указав Diff Command на WinMergeU.exe, обычно:

C:\Program Files (x86)\WinMerge\WinMergeU.exe

В аргументах используют:

-e -u -dl "Mine" -wr -dr "Theirs" $LOCAL $REMOTE $MERGED

Это приведет к тому, что левая сторона (помеченная как "Mine") будет редактируемой, и это будет выходной файл при сохранении в WinMerge. Правая сторона (с пометкой "Theirs") будет доступна только для чтения (это аргумент -wr), это необходимо, потому что WinMerge выводит все сохраненные файлы в файл $MERGED, поэтому, если обе стороны были отредактированы, он выведет левую сторону, а затем переписать это с правой стороны; Лучше всего избегать такого рода путаницы.

Если вы оставите опцию резервного файла включенной, WinMerge сгенерирует файл.bak. Содержимое этого файла будет либо исходным левым файлом, либо вторым по последнему выходным файлом, если вы сохранили несколько раз. Вы можете либо отключить это, либо добавить *.bak в ваш файл.gitignore.

Сам Git создаст файл конфликта *.orig ПОСЛЕ того, как конфликт разрешится, на тот случай, если вы его испортили. Опять же, вы можете добавить *.orig в ваш файл.gitignore или отключить эту функцию. К сожалению, SourceTree не имеет опции GUI для этого, поэтому запустите ваш git bash или, если вы выбрали правильную опцию PATH во время установки, командную строку Windows и сделайте следующее:

git config --global mergetool.keepBackup false

Это остановит Git при создании файлов *.orig. Вы также можете напрямую отредактировать файл конфигурации, найдя файл.gitconfig в корне вашего пользовательского каталога. Если вы знаете, как использовать VIM, вы можете отредактировать все это с помощью этой команды:

git config --global --edit

Git 2.5+ (второй квартал 2015 года) будет включать Winmerge в качестве известного git mergetool!

Если Winmerge в вашем %PATH%, git config merge.tool winmerge это все, что вам нужно сделать!
(Это работает и для инструмента сравнения: git config diff.tool winmerge)

Смотрите коммит 3e4f237 Дэвида Агилара ( davvid ), 20 мая 2015 г.
(Объединено Юнио С Хамано - gitster - в коммите 324a9f4, 01 июня 2015 г.)
Помогает: Филип Окли ( PhilipOakley ), Йоханнес Шинделин ( dscho Себастьян Шуберт ( sschuberth ), СЕДЕР ГАБОР ( szeder )

Весь конфиг теперь делается для вас непосредственно в самом Git, с mergetools/winmerge:

  • команда diff: "$merge_tool_path" -u -e "$LOCAL" "$REMOTE"
  • команда слияния: "$merge_tool_path" -u -e -dl Local -dr Remote "$LOCAL" "$REMOTE" "$MERGED"

mergetools: добавить winmerge в качестве встроенного инструмента

Добавьте скриптлет winmerge с командами, описанными в этом потоке, чтобы пользователи могли использовать winmerge без необходимости какой-либо дополнительной настройки.

Вот мой (в %userprofile%\.gitconfig, или же ~/.gitconfig на *nix), без оболочки (Win 7 Home Pro):

[diff]
    tool = winmerge
[difftool "winmerge"]
    cmd = c:/path/to/winmergeu.exe -e -u -x -wl -wr -dl "base" -dr "mine" \"$LOCAL\" \"$REMOTE\"

Первоначально я поддержал ответ @CapinWinky за использование WinMerge из SourceTree. Этот ответ все еще действителен, но WinMerge теперь также поддерживает трехстороннее слияние, для которого требуются дополнительные параметры.

В диалоговом окне "Параметры исходного дерева" я выбрал "Пользовательский" в качестве инструмента слияния и ввел команду как:

C:\Program Files\WinMerge\WinMergeU.exe

и аргументы как:

-u -fm -wl -wr -dl Remote_RO -dm Local_Merged -dr Base_RO $REMOTE $LOCAL $BASE -o $MERGED

Кажется, нет необходимости заключать параметры remote/local/base в кавычки, чтобы больше обслуживать пути с пробелами в них.

Эта конфигурация предназначена для использования средней панели в качестве объединенного выходного файла.

Справочник по командной строке

У меня была проблема, что при попытке слияния WinMerge не открывался. Sourcetree запускает Git, чтобы открыть выбранный вами инструмент. При использовании настраиваемой опции Sourcetree ваш конфигурационный файл git (например, C:\Users\Me\.gitconfig) модифицируется для добавления нового инструмента слияния под названием "sourcetree", а команда Git включает--tool=sourcetree. В какой-то момент файл.gitconfig не был обновлен правильно, и в этом разделе у меня было две строки cmd, одна из которых сломалась:

[mergetool "sourcetree"]
    cmd = 'C:/Program Files/WinMerge/WinMergeU.exe' -u -fm -wl -wr -dl Remote_RO -dm Local_Merged -dr Base_RO $REMOTE $LOCAL $BASE -o $MERGED
    trustExitCode = true
    cmd = 'C:/Program '

Исправление файла.gitconfig вручную решило проблему.

Это легче сделать, и это то, что сработало для меня:

git config --global diff.tool winmerge

git config --replace --global difftool.winmerge.cmd "\"C:\path to winmerge\WinMergeU.exe\" -e -u -dl \"Base\" -dr \"Mine\" $LOCAL $REMOTE"

git config --global difftool.prompt false

Чтобы сделать WinMerge инструментом сравнения и объединения для Git-плагина Visual Studio 2017:

Из командной строки Windows: введите >> git config --global --edit, который откроет файл.getconfig для редактирования.

Пожалуйста, обновите с помощью следующей команды:

[mergetool]
   prompt = false
   keepBackup = false
   keepTemporaries = false
[merge]
   tool = winmerge
   [mergetool "winmerge"]
   name = WinMerge
   trustExitCode = true
   cmd = \"C:\\Program Files (x86)\\WinMerge\\WinMergeU.exe\" -e -u -dl \"Base\" -dr \"Mine\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"
[diff]
   tool = winmerge
   [difftool "winmerge"]
   name = WinMerge
   trustExitCode = true
   cmd = \"C:\\Program Files (x86)\\WinMerge\\WinMergeU.exe\" -u -e $LOCAL $REMOTE

Ваш путь неверен, он должен быть "/c/Program Files (x86)/WinMerge/WinMergeU.exe",

Вы работаете в среде сценария оболочки, а не в командной строке Windows.

После установки TortoiseGit и WinMerge 2.16 (эта версия поддерживает трехстороннее слияние) я обнаружил, как WinMerge интегрируется с TortoiseGit:

D:\Program Files\WinMerge\WinMergeU.exe /e /ub /fm /wl /wr /dl %tname /dm %bname /dr %yname  %theirs %base %mine /o %merged /am

Итак, я отредактировал .gitconfig file и измените некоторые vars, чтобы он работал у меня (я добавил каталог WinMerge в системный путь):

[mergetool "winmerge"]
    cmd = WinMergeU -e -ub -fm -wl -wr $LOCAL $BASE $REMOTE -o $MERGED -am

Ввод настроек через командную строку был покрыт другими ответами. .gitconfig файл для полного трехстороннего слияния с WinMerge может быть настроен следующим образом (этот пример из Windows):

[merge]
    tool = WinMerge

[mergetool "WinMerge"]
    cmd = \"C:\\Program Files\\WinMerge\\WinMergeU.exe\" -e -u -dl \"Local\" -dm \"Base\" -dr \"Remote\" \"$LOCAL\" \"$BASE\" \"$REMOTE\" -o \"$MERGED\"
    trustExitCode = true
    keepBackup = false

[diff]
    tool = WinMerge

[difftool "WinMerge"]
    cmd = \"C:\\Program Files\\WinMerge\\WinMergeU.exe\" -e -u -dl \"Old $BASE\" -dr \"New $BASE\" \"$LOCAL\" \"$REMOTE\"
    trustExitCode = true

Флаг информации:

  • / e - позволяет закрыть WinMerge одним нажатием клавиши "esc".
  • / u - Запрещает WinMerge регистрировать файлы в недавно использованном списке.
  • / dl, / dm и /dl - описания для левой, средней и правой панелей.
  • / o - выходной файл. Сохранение ЛЮБОЙ панели выведет содержимое этой панели в выходной файл.

trustExitCode = true говорит git принять вывод без дальнейших подсказок.

keepBackup = false автоматически удалит автоматически сгенерированный *.orig файлы.

Примечание: переменные $BASE и $MERGE при использовании difftool просто содержат имя файла.

Если вы решили использовать форк-клиент, вы можете использовать следующие настройки:

Файл -> Настройки -> Интеграция ->

  • Инструмент слияния -> Пользовательский

Путь слияния


Аргументы

      -e -u -dl "Mine" -wr -dm "Merged" -dr "Theirs" $LOCAL $MERGED $REMOTE
  • Внешний инструмент сравнения -> Пользовательский

Путь слияния

      C:\Program Files\WinMerge\WinMergeU.exe

Аргументы

      -u -dl "Local" -dr "Remote" "$LOCAL" "$REMOTE"

Итак, я узнал, как установить WinMerge в GitConfig в качестве инструмента слияния и difftool, вот шаг с командой git bash:

  1. Установите инструмент слияния в GitConfig.

git config --global merge.tool WinMerge

  1. Установите путь WinMerge в соответствии с тем, где был установлен ваш WinMerge, мой был в программных файлах.

git config --global mergetool.WinMerge.path "C:\Program Files\WinMerge\WinMergeU.exe"

  1. Установите для mergetool.prompt значение false

git config --global mergetool.prompt false

  1. Установите difftool в конфигурации git

git config --global diff.tool WinMerge

  1. Установите путь к difftool,

git config --global difftool.WinMerge.path "C:\Program Files\WinMerge\WinMergeU.exe"

  1. Установите для приглашения difftool значение false

git config --global difftool.prompt false

Теперь вы можете сделать:

  1. git mergetool
  2. git difftool

счастливо :)

Потратив на это более часа, я установил черепаху, и пока она дает мне именно то, что я хочу.

Настройки Winmerge для Toritise git описаны в http://thoai-nguyen.blogspot.com.au/2012/03/setup-tortoise-git-and-winmerge.html

Здесь единственный, кто работает у меня с Visual Studio 2019 и моим winmerge 2.16.14.0:C:\Users\CurrentUserAccount\.gitconfig

      [difftool "winmerge"]
name = WinMerge
trustExitCode = true
    cmd = \"C:\\Program Files (x86)\\WinMerge\\WinMergeU.exe\" -e -u  \"$LOCAL\" \"$REMOTE\"
[diff]
    tool = winmerge
[difftool]
    prompt = false

Дополнительная вещь для проверки: файл MySolution.git\config (да, имя файла - "config" без расширения): проверьте, есть ли у вас:

      [diff]
tool = winmerge

Вы можете изменить его с помощью следующей команды (Меню Visual Studio "Git"\ Открыть в командной строке ":

      git config diff.tool winmerge

Итак, я никогда не использовал трехоконный режим для слияния и смог настроить все с помощью выше, но, как и в настоящее время с Winmerge 2.16.16.0, я смог получить желаемое поведение только с опцией «Открыть файл конфликта». Конфиг git для него:

      cmd = \"c:/Programs/WinMerge/WinMergeU\" -e $MERGED

Как по мне, это лучший вариант скорости/юзабилити без ручного обращения с этими специальными маркерами...

Пример:

git config --global --add diff.tool winmerge
git config --replace --global difftool.winmerge.cmd "\"C:\Program Files (x86)\WinMerge\WinMergeU.exe\" -e -u -dl \"Base\" -dr \"Mine\" $LOCAL $REMOTE"
git config --global difftool.prompt false
Другие вопросы по тегам