Я использую следующий скрипт в качестве mergetool, который работает довольно хорошо.
#!/bin/bash
# test args
if [ ! ${#} -ge 3 ]; then
echo 1>&2 "Usage: ${0} LOCAL REMOTE MERGED BASE"
echo 1>&2 " (LOCAL, REMOTE, MERGED, BASE can be provided by \`git mergetool'.)"
exit 1
fi
# tools
_EMACSCLIENT=/usr/local/bin/emacsclient
_BASENAME=/bin/basename
_CP=/bin/cp
_EGREP=/bin/egrep
_MKTEMP=/bin/mktemp
# args
_LOCAL=${1}
_REMOTE=${2}
_MERGED=${3}
if [ -r ${4} ] ; then
_BASE=${4}
_EDIFF=ediff-merge-files-with-ancestor
_EVAL="${_EDIFF} \"${_LOCAL}\" \"${_REMOTE}\" \"${_BASE}\" nil \"${_MERGED}\""
else
_EDIFF=ediff-merge-files
_EVAL="${_EDIFF} \"${_LOCAL}\" \"${_REMOTE}\" nil \"${_MERGED}\""
fi
# console vs. X
if [ "${TERM}" = "linux" ]; then
unset DISPLAY
_EMACSCLIENTOPTS="-t"
else
_EMACSCLIENTOPTS="-c"
fi
# run emacsclient
${_EMACSCLIENT} ${_EMACSCLIENTOPTS} -a "" -e "(${_EVAL})" 2>&1
# check modified file
if [ ! $(egrep -c '^(<<<<<<<|=======|>>>>>>>|####### Ancestor)' ${_MERGED}) = 0 ]; then
_MERGEDSAVE=$(${_MKTEMP} --tmpdir `${_BASENAME} ${_MERGED}`.XXXXXXXXXX)
${_CP} ${_MERGED} ${_MERGEDSAVE}
echo 1>&2 "Oops! Conflict markers detected in $_MERGED."
echo 1>&2 "Saved your changes to ${_MERGEDSAVE}"
echo 1>&2 "Exiting with code 1."
exit 1
fi
exit 0
Чтобы использовать его с `git mergetool ', добавьте в вашу конфигурацию git следующее:
[merge]
tool = ediff
[mergetool "ediff"]
cmd = /path/to/ediff-merge-script $LOCAL $REMOTE $MERGED $BASE
trustExitCode = true
Кроме того, вы должны проверить (в сценарии) пути используемых инструментов и работает ли для вас обнаружение консоли бедняка.
Сам скрипт запускает клиент emacs (или emacs, за которым следует клиент emacs, -a ""
) и пропускает либо ediff-merge-files-with-ancestor
, либо ediff-merge-files
, если нет базовой версии (например, при объединении двух ветвей, в которых один путь / файл был создан независимо).
После завершения работы клиента emacs объединенный файл проверяется на наличие маркеров конфликта. Если они будут найдены, ваша работа будет сохранена во временном файле, сценарий завершится с кодом 1, и git восстановит содержимое объединенного файла перед объединением.
Если маркеры конфликта отсутствуют, сценарий завершается с кодом 0, и git будет считать слияние успешным.
Важное замечание: Настройка параметра trustExitCode
для mergetool на true
, а также проверка после редактирования для маркеров конфликта не будут работать, если вы запустите emacsclient
с параметром --no-wait
.