Git в Windows:Как вы настраиваете инструмент слияния?

StackOverflow https://stackoverflow.com/questions/426026

  •  06-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

Чтобы продолжить ответ Чарльза Бейли, вот моя настройка git, которая использует p4merge ( р4мердж ) (бесплатный кроссплатформенный инструмент слияния 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.[инструмент].cmd", а не в "merge.[инструмент].cmd" (глупый я, потратил час на устранение неполадок, почему git продолжал жаловаться на несуществующий инструмент)
  • добавлены двойные кавычки для всех имен файлов, чтобы файлы с пробелами все еще можно было найти с помощью инструмента слияния (я тестировал это в msys Git из Powershell)
  • обратите внимание, что по умолчанию каталог установки будет добавлен к PATH, поэтому нет необходимости указывать полный путь к p4merge в команде

Скачать: http://www.perforce.com/product/components/perforce-visual-merge-and-diff-tools


Редактировать (Февраль 2014)

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

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

git mergetool --tool-help

Ты должен увидеть p4merge ( р4мердж ) в любом Доступно или действительный Список.Если нет, пожалуйста, обновите свой git.

Если p4merge ( р4мердж ) был указан как Доступно, это находится в вашем ПУТЬ и вам нужно только установить слияние.инструмент:

git config --global merge.tool p4merge

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

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.so нам просто нужно указать путь mergetool для git, например p4merge:

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

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

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

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

[merge]
    tool = kdiff3

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

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

В Cygwin only работал для меня так:

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 полный путь к инструменту (замените <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"'

После того, как вы настроили ваш любимый инструмент слияния, вам просто нужно запустить <=> всякий раз, когда вам нужно разрешить конфликты.

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

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

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

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

git config --global merge.tool p4merge

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

Как уже отвечено здесь (и здесь и < a href = "https://stackoverflow.com/questions/161813/how-do-i-fix-merge-conflicts-in-git"> здесь ), 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):

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

Я нашел два способа настройки "Исходный код DiffMerge" как difftool и 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\"

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

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 в качестве инструмента сравнения в TortoiseGit, то это то, что вам нужно ввести при вводе текста для пути к внешнему инструменту сравнения:

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)

Лебедин

[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 "$@" 

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top