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

46

Я пытаюсь интегрировать 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
Примечание: с Git 2.5+ (Q2 2015) Winmerge станет известным инструментом сравнения или слияния! Увидетьmy answer below VonC
Есть ли winmerge.sh в вашем $ PATH? И какая команда вызвала у вас эту ошибку (Ошибка отображается как: git config option merge.tool с неизвестным инструментом: winmerge)? positron

Ваш Ответ

10   ответов
0

.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 - Allows WinMerge to be closed via a single press of the 'esc' key. /u - Prevents WinMerge from logging the files in the recently used list. /dl, /dm, and /dl - Descriptions for Left, Middle, and Right panes. /o - The output file. Saving ANY pane will output that pane's contents to the output file.

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

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

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

24

le с 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
13

%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\"
Кажется, я нашел его :) Этот файл, по-видимому, находится в ~ / .gitconfig, который в Windows кажется моей папкой пользователя, то есть: c: \ users \ myuserfolder \
В примере конфигурации WinMerge настроен какdifftool, который предназначен только для чтения различий. Проверьте @ eis & apos; Ответьте за детали о слиянии.
Почему вы открываете файлы только для чтения? (-wl -wr) Ужасно, что побеждает точку слияния?
Это для difftool. Вопрос задаетmergetool
Я абсолютный новичок. Похоже, что это из какого-то файла конфигурации (например, файла .ini). Можете ли вы упомянуть, где это?
58

merge toolТем не менее, вы (и некоторые другие люди с ответами) настраивают его какdiff tool.

Чтобы настроить инструмент слияния, вам необходимо использовать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, так и для инструмента слияния.

В зависимости от того, какую оболочку вы используете (например, bash), экранирование$LOCAL, $REMOTE, а также$MERGED может не дать правильного результата в вашем .gitconfig, вы можете войти и отредактировать его вручную, но в остальном вышеприведенное работает хорошо.
@dvdvck Начиная с версии 2.16.0 (выпущенной 4 дня назад), он полностью поддерживает трехстороннее слияние (также в графическом интерфейсе).
Чтобы уточнить комментарий @AndrewTheken: приведенная выше команда config для mergetool.winmerge.cmd корректно работает в командной строке Windows (cmd.exe), но не в Bash (создает неправильную конфигурацию из-за расширения переменных) или Powershell (даже не запускается из-за (x86) часть пути).
Что касается ссылки winmerge, она говорит, что поддерживает трехстороннее объединение только с помощью командной строки, поэтому для целей git все в порядке
25

известногоgit mergetool!

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

Увидетьсовершить 3e4f237 отДавид Агилар (davvid)20 мая 2015 г.
(Merged by Junio C Hamano -gitster -- всовершить 324a9f401 июня 2015 г.)
Помогал-на:Филип Окли (PhilipOakley), Йоханнес Шинделин (dscho), Себастьян Шуберт (sschuberth), SZEDER G & # xE1; bor (szeder)

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

diff command: "$merge_tool_path" -u -e "$LOCAL" "$REMOTE" merge command: "$merge_tool_path" -u -e -dl Local -dr Remote "$LOCAL" "$REMOTE" "$MERGED" mergetools: add winmerge as a builtin tool

Add a winmerge scriptlet with the commands described in this thread, so that users can use winmerge without needing to perform any additional configuration.

@VonC, вы знаете, как заставить git показывать diff для вновь добавленных файлов? Для вновь добавленного файла winmerge показывает диалог с\\.\nul как один из пути, который является недействительным. Так что winmerge даже не показывает разницу.
@hIpPy Извините, я пропустилstackoverflow.com/q/39756836/6309.
@hlp не уверен, учитывая, что в любом случае diff будет всем файлом. Рассмотрите возможность размещения отдельного вопроса для этого.
Тема также указывает наthis configuration который полностью раскрыл дело для меня. Спасибо,
3

агина Visual Studio 2017:

Из командной строки Windows: введите & gt; & gt; 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
0

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
7

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
Том, не только это, но и обратная косая черта перед переменными $ REMOTE и $ LOCAL вызывает проблему с WinMerge (я использую последнюю версию 2.14.0.0 на данный момент)
Я опустил-dl "Base" поэтому одна сторона показывает имя файла. Другой по-прежнему помечен"Mine" так понятно
Я думаю, что $ LOCAL и $ REMOTE поменялись местами в этой версии.
4

"/c/Program Files (x86)/WinMerge/WinMergeU.exe".

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

1

TortoiseGit и пока он дает мне именно то, что я хочу.

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

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