Как я могу сделать 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:
- Установите инструмент слияния в GitConfig.
git config --global merge.tool WinMerge
- Установите путь WinMerge в соответствии с тем, где был установлен ваш WinMerge, мой был в программных файлах.
git config --global mergetool.WinMerge.path "C:\Program Files\WinMerge\WinMergeU.exe"
- Установите для mergetool.prompt значение false
git config --global mergetool.prompt false
- Установите difftool в конфигурации git
git config --global diff.tool WinMerge
- Установите путь к difftool,
git config --global difftool.WinMerge.path "C:\Program Files\WinMerge\WinMergeU.exe"
- Установите для приглашения difftool значение false
git config --global difftool.prompt false
Теперь вы можете сделать:
- git mergetool
- 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