Msys Git Параметры команды слияния инструмента
Я использую msys Git для управления версиями на компьютере с Windows, и я пытаюсь выяснить, как получить слияние tool, WinMerge, чтобы работать с Git.
Я следил за инструкциями в этом блоге, насколько это возможно, так как это самое близкое, что я нашел к тому, что я пытаясь сделать. В основном, что я сделал:
Измените мой файл .gitconfig
, чтобы включить следующее:
[merge]
tool = winmerge
[mergetool "winmerge"]
cmd = \"C:\\Program Files (x86)\\WinMerge\\WinMergeU.exe\" "$PWD/$LOCAL" "$PWD/$REMOTE" "$PWD/$MERGED"
trustExitCode = false
keepBackup = false
Это почти работает. Когда я пытаюсь запустить инструмент слияния из Git, WinMerge дает мне сообщение о том, что он не может найти пути к файлам, что имеет смысл, поскольку пути, которые он ищет, следующие:
C:\MY\WORKING\DIRECTORY\-e
C:\MY\WORKING\DIRECTORY\-ub
Похоже, что Git передает параметры в инструмент слияния вместо локальных и удаленных имен файлов, которые я ожидаю получить, если все работает правильно.
Я искал онлайн для документации Git merge, но я не могу найти ничего, что связано с тем, что я пытаюсь сделать. Я предполагаю, что решение будет одним из следующих:
- Измените переменные
$LOCAL
и $REMOTE
на правильные значения, считая $LOCAL
и $REMOTE
неверными.
- Напишите
.bat
script для вызова WinMergeU и обработайте аргументы Git отправляет инструмент слияния в логике моего .bat
script.
Ответы
Ответ 1
От Руководство по командной строке WinMerge:
cmd = \"C:\\Program Files (x86)\\WinMerge\\WinMergeU.exe /ub /e \"
cmd = \"C:\\Program Files (x86)\\WinMerge\\WinMergeU.exe /u /e \"
(/u - новый /ub с последним WinMerge)
может работать лучше как команда в разделе mergetool.
Однако вам может потребоваться обернуть этот вызов в script, как описано в этом SO-ответе.
Извлечение, адаптированное к merge.tool
:
Практический пример настройки mergetool
с помощью специального инструмента diff
:
C:\myGitRepo>git config --global merge.tool winmerge
C:\myGitRepo>git config --global mergetool.winmerge.cmd "winmerge.sh \"$LOCAL\" \"$REMOTE\""
C:\myGitRepo>git config --global mergetool.prompt false
С winmerge.sh
хранится в части каталога вашего PATH
:
#!/bin/sh
echo Launching WinMergeU.exe: $1 $2
"C:/Program Files/WinMerge/WinMergeU.exe" -e -ub "$1" "$2"
Если у вас есть другой инструмент (kdiff3
, P4Diff
,...), создайте еще одну оболочку script и соответствующую директиву mergetool.myMergeTool.cmd
.
Затем вы можете легко переключать инструменты с помощью merge.tool
config.
Ответ 2
Если вы посмотрите на конфликтующий файл, вы увидите стандартные маркеры Theirs >>>>>>>
и <<<<<< Mine
. WinMerge понимает их как конфликты слияния, поэтому не нужно явно указывать "Их" и "Мина"; просто нужно сказать, какой файл он имеет с маркерами конфликта.
- Мы знаем, что файл в рабочем каталоге содержит маркеры.
-
Имеет смысл, что файл, с которым мы объединяемся, также будет этим файлом - мы также знаем, что git mergetool
делает доступную переменную $MERGED
, которая называет этот файл.
[mergetool "winmerge"]
cmd = 'C:/Program Files/WinMerge/WinMergeU.exe' \"$MERGED\"
Это все, что вам нужно, чтобы подключить git к WinMerge для разрешения слияния/разрешения; не требуется никаких сценариев или командной строки. Обратитесь к третьей форме командной строки в документах (связанных OP, см. Выше) и объяснении аргумента conflictfile
.
Ответ 3
[mergetool "winmerge"]
cmd = winmergeu -e -ub -wl -dl "Remote" -dr "Local" "$PWD/$REMOTE" "$PWD/$LOCAL" "$PWD/$MERGED"
keepBackup = false
Если вы заглянете внутрь C:\Program Files\Git\share\git-gui\lib\mergetool.tcl
, у него есть синтаксис для общих инструментов слияния.
Я все еще пытаюсь выяснить, как вызвать mergetool непосредственно из Git GUI...