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

347

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

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

Джейк
источник
4
Git Extensions имеет пользовательский интерфейс git, который имеет довольно хороший и удобный для пользователя инструмент для слияния окон.
KallDrexx
Похоже, вам нужен TortoiseGit?
Сергей

Ответы:

305

Чтобы проконтролировать ответ Чарльза Бэйли, вот моя настройка git, использующая p4merge (бесплатный кроссплатформенный инструмент 3way merge); проверено на 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 config, т.е. действителен для всех проектов 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 в доступном или действительном списке. Если нет, пожалуйста, обновите ваш мерзавец.

Если 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 был установлен для текущего пользователя, а не для всей системы (не требует прав администратора или повышения уровня контроля учетных записей)
  • Хотя ~следует расширить до домашнего каталога текущего пользователя (так что теоретически путь должен быть ~/AppData/Local/Perforce/p4merge.exe), это не сработало для меня
  • Еще лучше было бы воспользоваться преимуществами переменной среды (например $LOCALAPPDATA/Perforce/p4merge.exe), git, похоже, не расширяет переменные среды для путей (если вы знаете, как это работает, пожалуйста, дайте мне знать или обновите этот ответ)
Милан Гардиан
источник
Хм - попробуем это - первый конфиг работает нормально, следующий просто отображает текст справки для git config. Не уверен почему.
Дэнни Стейпл
1
Понял - эти одиночные кавычки выглядят подозрительно для меня. Просто удвойте это, и они работают.
Дэнни Стейпл
13
установка mergetool.p4merge.cmdбольше не будет работать, так как Git начал пытаться поддерживать p4merge, см libexec/git-core/git-mergetool--lib. вместо этого он непосредственно используетmergetool.p4merge.path
Gregory Pakosz
5
Пришлось проложить полный путь и избежать двойных кавычек:cmd = \""c:/Program Files/TortoiseSVN/bin/TortoiseMerge.exe"\" -base:"$BASE" -theirs:"$REMOTE" -mine:"$LOCAL" -merged:"$MERGED"
Людовик Куты
21
Это сделало это для меня: git config --global mergetool.p4merge.cmd '"C:\\Program Files\\Perforce\\p4merge" $BASE $LOCAL $REMOTE $MERGED'на компьютере с Windows 7
Дэн П.
88

настройка 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

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

daizuozhuo
источник
1
Работает с Beyond Compare 3, а также. Просто используйте вместо этого путь к BComp.exe. Спасибо!
Ричард Энтони Хейн
4
Я понимаю, что это старая тема, но я не могу заставить этот путь работать. Я немного озадачен тем, как путь должен быть экранирован с учетом взаимодействия cmd / msys ... РЕДАКТИРОВАТЬ Переключение на двойные кавычки исправило это!
Руставоре
Спасибо Гитниня! Обратите внимание, что вы можете ввести это в Git Bash, но если вы используете команду Prompt, вы должны изменить одинарную кавычку на двойную
Hải Phong
61

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

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

[merge]
    tool = kdiff3

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

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

Dɑvïd
источник
13
на моем ПК с Win7 я должен был использовать path = C:\\Program Files (x86)\\KDiff3\\kdiff3.exe(обратите внимание на двойную обратную косую черту)
Someone Somewhere
Я получил ошибку, подобную этой: «Команда diff инструмента недоступна как« D: \ software \ melddiff \ Meld.exe »»
Аллен Ворк,
Знаете ли вы, если есть разница с порядком, где каждый раздел добавляется. Я имею в виду, если [merge] будет после [mergetool]?
Самуил
20

При 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
склеечный пресс
источник
16

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 является довольно хорошим автономным инструментом слияния.

CB Bailey
источник
8

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

git config --global merge.tool bc3
git config --global mergetool.bc3.path "C:\Program Files (x86)\Beyond Compare 3\BCompare.exe"
developer747
источник
2
Я использовал эти команды, но вместо Beyond Compare я использую WinMerge.
Брент Келлер
6

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

git config --global merge.tool p4merge

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

friederbluemle
источник
Это ключ. После установки p4merge и установки точного местоположения mergetool.p4merge.path он все равно не работал. Добавление папки установки к пути работало.
RichardM
5

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

hlovdal
источник
4

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

git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge $BASE $LOCAL $REMOTE $MERGED'
Майк Гленн
источник
3

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

Бах, это наконец-то сработало для меня (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!

Натан МакДэниел
источник
3

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

это скрипт bash, который я использую из 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 в пустом файле, и создает новый временный файл в правильном месте.

ксеро
источник
3

Я нашел два способа настроить « SourceGear DiffMerge » как difftool и mergetool в Windows 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\"
vineel
источник
1

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

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

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

Роберто
источник
1

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

path\to\gvim.exe -f -d -c "wincmd R" -c "wincmd R" -c "wincmd h" -c "wincmd J"
Аттила Сереми
источник
1

Для 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

Файл ~ / winpath.sh предназначен для преобразования путей в Windows в msys и взят из вопроса о преобразовании путей msys в stackoverflow

#! /bin/sh                                                               

function wpath {                                                         
    if [ -z "$1" ]; then                                                 
        echo "$@"                                                        
    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 "$@" 
Усман Салим
источник
0

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

Каутский Лозано
источник