29

如何让 gitgit mergetool针对任何合并冲突自动运行?这应该适用于所有合并,使用merge, rebase,pull等。

4

3 回答 3

8

你不能(还)让 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
于 2013-07-17T07:35:13.543 回答
4

你总是可以使用别名

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 中的“如何解决冲突”)。

于 2012-04-05T16:46:59.863 回答
2

据我所知,没有瓷器可以做到这一点。

您可以像这样围绕 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 时,包装器都会检查是否弹出“冲突”一词。如果是 - 包装器启动合并工具。

这可以通过添加更精确的短语来改进$SEARCH(如“自动合并失败;修复冲突然后提交结果。”)以及检查第一个参数 ( $1) 是否在导致合并冲突的命令列表中 ( pull, merge, ETC...)。否则如果 git 命令输出太长,你最终会解析很多不必要的数据。

于 2013-07-12T16:52:56.047 回答