Параметры команды Msys Git Merge Tool Проблема - PullRequest
20 голосов
/ 11 марта 2009

Я использую msys Git для управления исходным кодом на компьютере с Windows и пытаюсь выяснить, как заставить мой инструмент слияния 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, но, похоже, не могу найти ничего, связанного с тем, что я пытаюсь сделать. Я предполагаю, что решение будет одним из следующих:

  1. Измените переменные $LOCAL & $REMOTE на правильные значения, предполагая, что $LOCAL & $REMOTE неверны.
  2. Напишите скрипт .bat для вызова WinMergeU и обработайте аргументы, которые Git отправляет инструменту слияния, в рамках логики моего .bat скрипта.

Ответы [ 3 ]

12 голосов
/ 13 февраля 2010

Если вы посмотрите на конфликтующий файл, вы заметите стандартные маркеры Theirs >>>>>>> и <<<<<< Mine. WinMerge понимает их как конфликты слияния, поэтому не нужно явно указывать «Theirs» и «Mine»; нужно просто указать, какой файл имеет маркеры конфликта.

  1. Мы знаем, что файл в рабочем каталоге содержит маркеры.
  2. Имеет смысл, что файл, с которым мы объединяемся, также будет этим файлом - мы также знаем, что git mergetool делает доступной переменную $MERGED, которая называет этот файл.

    [mergetool "winmerge"]
        cmd = 'C:/Program Files/WinMerge/WinMergeU.exe' \"$MERGED\"
    

Это все, что вам нужно, чтобы подключить Git к WinMerge для слияния / разрешения конфликтов; не требуются сценарии или параметры командной строки. Обратитесь к 3-й форме командной строки в документации (связанной с ОП выше) и объяснению аргумента conflictfile.

7 голосов
/ 11 марта 2009

С Руководство по командной строке 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.

Однако вам, возможно, придется заключить этот вызов в сценарий, как описано в этом 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, ...), создайте другой сценарий оболочки и соответствующую директиву конфигурации mergetool.myMergeTool.cmd.
Тогда вы можете легко переключать инструменты с помощью конфигурации merge.tool.

5 голосов
/ 10 мая 2009
[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 ...

...