Как сделать git автоматически запускать git mergetool
для любого конфликта слияния? Это должно применяться для всех слияний, используя merge
, rebase
, pull
и т.д.
Как сделать git автоматически открывать mergetool, если есть конфликт слияния?
Ответ 1
Вы не можете (пока) сделать git сделать это.
Это может быть или не быть приемлемым решением.
Создайте функцию в ~/.bashrc
:
git()
{
if [[ $1 == "merge" ]] || [[ $1 == "rebase" ]] || [[ $1 == "pull" ]]; then
command git "[email protected]"
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 "[email protected]"
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
Ответ 2
Вы всегда можете использовать псевдоним
alias 'git-merge'='git merge && git mergetool'
alias 'git-rebase'='git rebase && git mergetool'
alias 'git-pull'='git pull && git mergetool'
И/или напишите вспомогательный script вдоль этих строк
#/bin/bash
git $*
[ "$(git ls-files –abbrev –unmerged | wc -l)" -gt 0 ] && git mergetool
а затем
alias git='~/.git/git-script'
Прямого способа вызова mergetool нет, потому что это только один из нескольких способов слияния (см. "КАК РЕШИТЬ КОНФЛИКТЫ" в man 1 git -merge).
Ответ 3
Насколько я знаю, нет никакого фарфорового способа сделать это.
У вас может быть оболочка вокруг git, как это (файл git_mergetool.sh
, на вашем пути, +x
):
#!/bin/bash
SEARCH="CONFLICT"
OUTPUT=$(git "[email protected]" 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". Если это так - wrapper запускает mergetool.
Это можно улучшить, добавив более точную фразу к $SEARCH
(например, "Автоматическое слияние не удалось, устранить конфликты и затем зафиксировать результат" ), а также проверить, есть ли в списке первый аргумент ($1
) команд, приводящих к конфликту слияния (pull
, merge
и т.д.). В противном случае вы закончите синтаксический анализ большого количества ненужных данных, если вывод команды git слишком длинный.