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