Git в Windows: как вы устанавливаете mergetool?

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

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

Ответы

Ответ 1

Для ответа на вопрос Чарльза Бейли, здесь моя установка 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, вторая строка:

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

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

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

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


РЕДАКТИРОВАТЬ (февраль 2014)

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

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

git mergetool --tool-help

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

Если p4merge был указан как доступный, он находится в вашем PATH, и вам нужно только установить merge.tool:

git config --global merge.tool p4merge

Если он был указан как действительный, вы должны определить mergetool.p4merge.path в дополнение к merge.tool:

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, похоже, не расширяет переменные среды для путей (если вы знаете, как это сделать, сообщите мне или обновите этот ответ)

Ответ 2

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

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

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

Ответ 3

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

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

[merge]
    tool = kdiff3

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

Хорошо работать сейчас!

Ответ 4

Под 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)"'

Кроме того, мне нравится отключать подсказку для diffftool:

git config --global difftool.prompt false

Ответ 5

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

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

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

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

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

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

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

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

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

Ответ 6

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

git config --global merge.tool p4merge

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

Ответ 7

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

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

Ответ 8

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

Ответ 9

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

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

Ответ 10

Если вы делаете это через 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`'

Ответ 11

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

В .git/config:

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

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

Ответ 12

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

это bash script я из директивы mergetool через .gitconfig

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

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

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

Ответ 13

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

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

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

Ответ 14

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

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

Ответ 15

Для IntelliJ IDEA (Community Edition) 3-way 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

~/winpath.sh - это преобразование путей в Windows на msys и взято из fooobar.com/questions/6462/...

#! /bin/sh                                                               

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

wpath "[email protected]" 

Ответ 16

Я нашел два способа настроить " SourceGear DiffMerge" как diffftool и mergetool в github Windows.

Следующие команды в окне командной строки обновят ваш .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\"

Ответ 17

Чтобы настроить p4merge, установленный с использованием шоколада на окнах для слияния и разброса, посмотрите здесь: https://gist.github.com/CamW/88e95ea8d9f0786d746a

Ответ 18

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