Подтвердить что ты не робот

Как сделать git автоматически открывать mergetool, если есть конфликт слияния?

Как сделать git автоматически запускать git mergetool для любого конфликта слияния? Это должно применяться для всех слияний, используя merge, rebase, pull и т.д.

4b9b3361

Ответ 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 слишком длинный.