J'utilise le script suivant que mergetool qui fonctionne très bien.
#!/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
À utiliser avec git mergetool', placez la ligne suivante dans votre git config:
[merge]
tool = ediff
[mergetool "ediff"]
cmd = /path/to/ediff-merge-script $LOCAL $REMOTE $MERGED $BASE
trustExitCode = true
En outre, vous devriez vérifier (dans le script) les chemins des outils utilisés et si le pauvre homme de la console de détection fonctionne pour vous.
Le script en lui-même commence un client emacs (ou emacs suivie par un client emacs, -a ""
) et est évaluée comme soit ediff-merge-files-with-ancestor
ou ediff-merge-files
si il n'y a pas de version de base (par exemple, lors de la fusion de deux branches où le même chemin/fichier a été créé de façon indépendante).
Après la emacs client a fini de la fusion de vérification du fichier de marqueurs de conflit. Devraient-elles être trouvé, votre travail sera enregistré à l'écart dans un fichier temporaire, le script se terminera avec le code 1 et git sera de restaurer la pré-mergetool contenu du fichier fusionné.
Lorsqu'il n'existe pas de marqueurs de conflit présent, le script se termine avec le code 0 et git va considérer l'opération comme un succès.
Important: le Réglage de la mergetool option trustExitCode
de true
ainsi que la post-édition vérifier les marqueurs de conflit ne fonctionnera pas si vous commencez emacsclient
avec l' --no-wait
option.