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