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...