Как сделать так, чтобы git автоматически открывал mergetool в случае конфликта слияния?
Как сделать так, чтобы git автоматически запускался git mergetool
для любого конфликта слияния? Это должно применяться для всех слияний, используя merge
, rebase
, pull
, так далее.
3 ответа
Вы не можете (пока) заставить git сделать это.
Это может или не может быть приемлемым обходным путем.
Создать функцию в вашем ~/.bashrc
:
git()
{
if [[ $1 == "merge" ]] || [[ $1 == "rebase" ]] || [[ $1 == "pull" ]]; then
command git "$@"
rc=$?
if [[ $rc == 1 ]]; then
echo "There are conflicts, better run git-mergetool!!!"
# There might be some other condition that returns a '1',
# if so you can add another check like this:
# if grep Conflicts $(git --git-dir)/MERGE_MSG;
command git mergetool
fi
else
command git "$@"
fi
}
Mergetool не вызывается при слиянии:
$ git merge non_conflicting_branch
Merge made by the 'recursive' strategy.
bar | 0
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 bar
Mergetool вызывается при возникновении конфликтов:
$ git merge conflicting_branch
Auto-merging foo
CONFLICT (content): Merge conflict in foo
Automatic merge failed; fix conflicts and then commit the result.
There are Conflicts, better run git-mergetool!!!
Mergetool не вызывается на другие ошибки:
$ git merge adasds
fatal: adasds - not something we can merge
Вы всегда можете использовать псевдоним
alias 'git-merge'='git merge && git mergetool'
alias 'git-rebase'='git rebase && git mergetool'
alias 'git-pull'='git pull && git mergetool'
И / или написать вспомогательный скрипт по этим направлениям
#/bin/bash
git $*
[ "$(git ls-files –abbrev –unmerged | wc -l)" -gt 0 ] && git mergetool
а потом
alias git='~/.git/git-script'
Нет прямого способа вызвать mergetool, потому что это только один из нескольких способов слияния (см. "КАК РАЗРЕШИТЬ КОНФЛИКТЫ" в man 1 git-merge).
Насколько я знаю, нет никакого фарфорового способа сделать это.
Вы можете иметь обертку вокруг Git, как это (файл git_mergetool.sh
на вашем пути, +x
):
#!/bin/bash
SEARCH="CONFLICT"
OUTPUT=$(git "$@" 2>&1 | tee /dev/tty)
if `echo ${OUTPUT} | grep -i "${SEARCH}" 1>/dev/null 2>&1`
then
git mergetool
fi
Затем добавьте псевдоним:
echo alias git=\"git_mergetool.sh\" >> ~/.bashrc
Каждый раз, когда вы вызываете git, оболочка будет проверять, не всплывает ли слово "CONFLICT". Если это так - обертка запускает mergetool.
Это можно улучшить, добавив более точную фразу в $SEARCH
(например, "Сбой автоматического слияния; исправление конфликтов и последующее принятие результата."), а также проверка первого аргумента ($1
) находится в списке команд, приводящих к конфликту слияния (pull
, merge
, так далее...). В противном случае вы закончите анализ большого количества ненужных данных, если вывод команды git слишком длинный.