Как сделать так, чтобы 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 слишком длинный.

Другие вопросы по тегам