Git на Windows: Как настроить mergetool?

Я пробовал msysGit и Git на Cygwin. Оба работают отлично и сами по себе, и оба отлично работают с gitk и Git-gui.

теперь, как, черт возьми, я могу настроить mergetool? (Vimdiff работает на Cygwin, но предпочтительно я хотел бы что-то более удобное для некоторых из наших сотрудников, любящих Windows.)

18 ответов


чтобы следить за ответом Чарльза Бейли, вот моя настройка git, которая использует p4merge (бесплатный кросс-платформенный инструмент слияния 3way); протестирован на msys Git (Windows) установить:

git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"'

или из Windows cmd.exe shell, вторая строка становится :

git config --global mergetool.p4merge.cmd "p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\""

изменения (относительно Чарльза Бейли):

  • добавлен в глобальную конфигурацию git, т. е. действителен для всех проектов git, а не только для текущего
  • конфигурация пользовательского инструмента значение находится в "mergetool.[инструмент.]cmd", а не "слияние".[инструмент.]cmd " (глупый я, потратил час на устранение неполадок, почему git продолжал жаловаться на несуществующий инструмент)
  • добавлены двойные кавычки для всех имен файлов, чтобы файлы с пробелами все еще можно было найти с помощью инструмента слияния (я тестировал это в msys Git из Powershell)
  • обратите внимание, что по умолчанию Perforce добавит свой установочный каталог в PATH, поэтому нет необходимости указывать полный путь к p4merge в команда

загрузить: http://www.perforce.com/product/components/perforce-visual-merge-and-diff-tools


редактировать (февраля 2014 года)

как указал @Gregory Pakosz, последний префикса msys ГИТ теперь "нативно" поддерживает p4merge (проверено на 1.8.5.2.msysgit.0).

вы можете отобразить список поддерживаемых инструментов бег:

git mergetool --tool-help

вы должны увидеть p4merge либо скачать или действительный список. Если нет, обновите git.

если p4merge значится как скачать, это в ваш путь и вам нужно только установить слияние.инструмент:

git config --global merge.tool p4merge

если он был указан как действительный, вы должны определить mergetool.p4merge.путь in дополнение к слияние.инструмент:

git config --global mergetool.p4merge.path c:/Users/my-login/AppData/Local/Perforce/p4merge.exe
  • выше приведен пример пути, когда p4merge был установлен для текущего пользователя, а не для всей системы (не требуется прав администратора или высоты UAC)
  • хотя ~ должен расширяться до домашнего каталога текущего пользователя (поэтому теоретически путь должен быть ~/AppData/Local/Perforce/p4merge.exe), это не сработало для меня
  • еще лучше было бы воспользоваться переменной среды (например,$LOCALAPPDATA/Perforce/p4merge.exe), git не кажется чтобы расширить переменные среды для путей (если вы знаете, как заставить это работать, сообщите мне или обновите этот ответ)

настройки mergetool.p4merge.cmd больше не будет работать, так как Git начал пытаться поддерживать p4merge, см. libexec/git-core/git-mergetool--lib.поэтому нам просто нужно указать путь mergetool для git, например p4merge:

git config --global mergetool.p4merge.path 'C:\Program Files\Perforce\p4merge.exe'
git config --global merge.tool p4merge

тогда он будет работать.


Я использую портативный Git на WinXP (работает удовольствие!), и необходимо решить конфликт, который возник в ветвлении. Из всех gui я проверил,KDiff3 оказался наиболее прозрачным для использования.

но я нашел инструкции, которые мне нужны, чтобы заставить его работать в Windows в этот блог, инструкции, которые немного отличаются от других подходов, перечисленных здесь. Это в основном составило добавление этих строк в my .gitconfig файл:

[merge]
    tool = kdiff3

[mergetool "kdiff3"]
    path = C:/YourPathToBinaryHere/KDiff3/kdiff3.exe
    keepBackup = false
    trustExitCode = false

работает хорошо сейчас!


под Cygwin,только то, что сработало для меня, это следующее:

git config --global merge.tool myp4merge
git config --global mergetool.myp4merge.cmd 'p4merge.exe "$(cygpath -wla $BASE)" "$(cygpath -wla $LOCAL)" "$(cygpath -wla $REMOTE)" "$(cygpath -wla $MERGED)"'
git config --global diff.tool myp4diff
git config --global difftool.myp4diff.cmd 'p4merge.exe "$(cygpath -wla $LOCAL)" "$(cygpath -wla $REMOTE)"'

кроме того, мне нравится отключать быстрое сообщение для difftool:

git config --global difftool.prompt false

git mergetool полностью настраивается, поэтому вы можете в значительной степени выбрать свой любимый инструмент.

полная документация здесь:http://www.kernel.org/pub/software/scm/git/docs/git-mergetool.html

вкратце, вы можете установить mergetool по умолчанию, установив переменную конфигурации пользователя merge.tool.

если инструмент слияния является одним из тех, которые поддерживаются изначально им, вам просто нужно установить mergetool.<tool>.path полный путь к инструменту (replace <tool> by что вы настроили merge.tool быть.

в противном случае, вы можете установить mergetool.<tool>.cmd немного оболочки, чтобы быть eval'Ed во время выполнения с переменными оболочки $BASE, $LOCAL, $REMOTE, $MERGED установите соответствующие файлы. Вы должны быть немного осторожны с экранированием, если вы непосредственно редактируете файл конфигурации или устанавливаете переменную с .

что-то вроде этого должно дать аромат того, что вы можете сделать ("mymerge" - вымышленный инструмент).

git config merge.tool mymerge
git config merge.mymerge.cmd 'mymerge.exe --base "$BASE" "$LOCAL" "$REMOTE" -o "$MERGED"'

после установки ваш любимый инструмент слияния, это просто вопрос работает git mergetool когда у вас есть конфликты разрешать.

инструмент p4merge от Perforce-довольно хороший автономный инструмент слияния.


Кажется, что более новые версии git поддерживают p4merge напрямую, поэтому

git config --global merge.tool p4merge

должно быть все, что вам нужно, если p4merge.ехе на вашем пути. Нет необходимости настраивать cmd или path.


для сравнения в Windows 7

git config --global merge.tool bc3
git config --global mergetool.bc3.path "C:\Program Files (x86)\Beyond Compare 3\BCompare.exe"

Как уже ответили здесь (и здесь и здесь), mergetool-это команда для настройки этого. Для хорошего графического интерфейса я рекомендую kdiff3 (GPL).


мне пришлось отказаться от дополнительного цитирования с помощью msysGit в windows 7, Не знаю почему.

git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge $BASE $LOCAL $REMOTE $MERGED'

Если вы делаете это через cygwin, вам может потребоваться использовать cygpath:

git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge `cygpath -w $BASE` `cygpath -w $LOCAL` `cygpath -w $REMOTE` `cygpath -w $MERGED`'

Ба, да это наконец-то работал на меня (Windows 7 + Cygwin + TortoiseMerge):

In .git / config:

cmd = TortoiseMerge.exe /base:$(cygpath -d \"$BASE\") /theirs:$(cygpath -d \"$REMOTE\") /mine:$(cygpath -d \"$LOCAL\") /merged:$(cygpath -d \"$MERGED\")

благодаря предыдущим плакатам для подсказки использовать cygpath!


Я использую приложение под названием WinMerge (http://winmerge.org/ ) информация из их руководства (http://manual.winmerge.org/CommandLine.html)

это скрипт bash, который я использую из mergetool директива via .gitconfig

#!/bin/sh
# using winmerge with git
# replaces unix style null files with a newly created empty windows temp file

file1=
if [ "$file1" == '/dev/null' ] || [ "$file1" == '\.\nul' ] || [ ! -e "$file1" ]
    then 
       file1="/tmp/gitnull"
       `echo "">$file1`
fi
file2=
if [ "$file2" == '/dev/null' ] || [ "$file2" == '\.\nul' ] || [ ! -e "$file2" ]
    then 
       file2="/tmp/gitnull"
       `echo "">$file2`
fi
echo diff :  -- 
"C:\Program files (x86)\WinMerge\WinMergeU.exe" -e -ub -dl "Base" -dr "Mine" "$file1" "$file2"

в основном bash учитывает, когда результат diff в пустом файле и создает новый временный файл в правильном месте.


Я нашел два способа, чтобы настроить "SourceGear DiffMerge " как difftool и mergetool в окнах github.

следующие команды в окне командной строки будет обновить .gitconfig для настройки GIT используйте DiffMerge:

git config --global diff.tool diffmerge
git config --global difftool.diffmerge.cmd 'C:/Program\ Files/SourceGear/Common/DiffMerge/sgdm.exe  \"$LOCAL\" \"$REMOTE\"'

git config --global merge.tool diffmerge
git config --global mergetool.diffmerge.cmd  'C:/Program\ Files/SourceGear/Common/DiffMerge/sgdm.exe  -merge  -result=\"$MERGED\" \"$LOCAL\" \"$BASE\" \"$REMOTE\"'

[или]

добавьте следующие строки .gitconfig хранит настройки. Этот файл должен быть в вашем домашнем каталоге в C:\Users\UserName:

[diff]
    tool = diffmerge
[difftool "diffmerge"]
    cmd = C:/Program\ Files/SourceGear/Common/DiffMerge/sgdm.exe \"$LOCAL\" \"$REMOTE\"

[merge]
    tool = diffmerge
[mergetool "diffmerge"]
    trustExitCode = true
    cmd = C:/Program\ Files/SourceGear/Common/DiffMerge/sgdm.exe -merge -result=\"$MERGED\" \"$LOCAL\" \"$BASE\" \"$REMOTE\"

вы также можете добавить эти параметры:

git config --global merge.tool p4mergetool
git config --global mergetool.p4merge.cmd 'p4merge $BASE $LOCAL $REMOTE $MERGED'
git config --global mergetool.p4mergetool.trustExitCode false
git config --global mergetool.keepBackup false

кроме того, я не знаю, почему, но цитата и Слэш из ответа Милана Гардиана испортили мне все.


Если кто-то хочет использовать gvim в качестве инструмента diff на TortoiseGit, то это то, что вам нужно ввести в текстовый ввод для пути к внешнему инструменту diff:

path\to\gvim.exe -f -d -c "wincmd R" -c "wincmd R" -c "wincmd h" -c "wincmd J"

для IntelliJ IDEA (Community Edition) 3-полосная конфигурация git mergetool в среде Windows (~/.gitconfig)

Cygwin

[mergetool "ideamerge"]
     cmd = C:/Program\ Files\ \(x86\)/JetBrains/IntelliJ\ IDEA\ Community\ Edition\ 14.1.3/bin/idea.exe merge `cygpath -wa $LOCAL` `cygpath -wa $REMOTE` `cygpath -wa $BASE` `cygpath -wa $MERGED`
[merge]
     tool = ideamerge

префикса msys

[mergetool "ideamerge"]
cmd = "/c/Program\ Files\ \(x86\)/JetBrains/IntelliJ\ IDEA\ Community\ Edition\ 14.1.3/bin/idea.exe" merge `~/winpath.sh $LOCAL` `~/winpath.sh $REMOTE` `~/winpath.sh $BASE` `~/winpath.sh $MERGED`
[merge]
 tool = ideamerge

the ~/winpath.sh это конвертировать пути к Windows на msys и берется из msys вопрос преобразования пути на stackoverflow

#! /bin/sh                                                               

function wpath {                                                         
    if [ -z "" ]; then                                                 
        echo "$@"                                                        
    else                                                                 
        if [ -f "" ]; then                                             
            local dir=$(dirname "")                                    
            local fn=$(basename "")                                    
            echo "$(cd "$dir"; echo "$(pwd -W)/$fn")" | sed 's|/|\|g';  
        else                                                             
            if [ -d "" ]; then                                         
                echo "$(cd ""; pwd -W)" | sed 's|/|\|g';              
            else                                                         
                echo "" | sed 's|^/\(.\)/|:\|g; s|/|\|g';          
            fi                                                           
        fi                                                               
    fi                                                                   
}                                                                        

wpath "$@" 

чтобы настроить p4merge, установленный с помощью chocolatey на windows для слияния и diff, посмотрите здесь: https://gist.github.com/CamW/88e95ea8d9f0786d746a


Если у вас возникли проблемы с открытием p4merge - SourceTree-ищите локальный файл конфигурации с именем config под MyRepo.Git и удалить любую конфигурацию слияния. В моем случае он пытался открыть Meld, который я только что удалил