2012-04-05 101 views
23

如何让git自动运行git mergetool以解决任何合并冲突?这应该适用于所有的合并,使用mergerebasepull如何让git在合并冲突时自动打开mergetool?

+1

也许你可以使用[githook](http://www.kernel.org/pub/software/scm/git/docs/githooks.html),例如, '后结账'(我不知道它是否真的在合并过程中被调用过,'合并后'需要成功合并) – 2012-08-03 08:35:56

+1

@TobiasKienzler你可能会做某事。如果你能找出一个工作解决方案,我会给你这个问题的赏金。 – 2013-07-14 23:03:13

+0

@QuinnStrahl我不认为目前存在一个钩子,在每个导致合并的各种命令之前执行,所以[rospov的包装](http://stackoverflow.com/a/17620046/321973)可能是最简单的解决方案或者修改git源代码以实现'预合并'钩子功能,在这种情况下,你当然可以简单地使用git在冲突上运行mergetool,具体取决于配置设置...... – 2013-07-15 07:54:46

回答

3

你总是可以使用别名

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

+3

正如我所提到的,如果发生冲突,我只想调用'mergetool'。 “合并的几种方式中只有一种”的说法并不令人信服。是的,有多种方式,但想要选择一种作为默认是合理的。 – 2012-04-05 17:51:54

+1

如果没有冲突,git mergetool将不会执行任何操作。 – j13r 2012-04-05 18:17:41

+2

它将打印一条消息。 – 2012-04-05 18:27:19

2

据我所知,没有瓷器的做法。

你可以有大约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”字样。如果它包装 - 启动mergetool。

这可以通过添加更多的精确短语$SEARCH得到改善(如“自动合并失败;固定冲突,然后提交的结果。”)通过检查以及如果第一参数($1)是在所得的命令的列表合并冲突(pullmerge等)。否则,如果git命令输出太长,您将最终解析大量不必要的数据。

+0

是否有可能没有有效别名混帐? – 2013-07-13 11:56:25

+0

@QuinnStrahl你可以命名脚本'git'(没有文件扩展名),并放在你的路径之前的实际git可执行文件。但它几乎是另一种别名方式。所以不,我不知道有一种方法可以在不混淆git的情况下实现。 – 2013-07-13 16:54:15

+2

应该有点可行,但CONFLICT正则表达式需要改进。我认为它现在会在任何地方捡起它,甚至在例如。差异输出。至少您可以按行位置过滤(例如锚点),也可以展开文本。 – 2013-07-17 22:37:07

5

你还不能让git做到这一点。


这可能是也可能不是可接受的解决方法。

~/.bashrc创建一个函数:

$ 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!!! 

合并工具:当有冲突

$ git merge non_conflicting_branch 
Merge made by the 'recursive' strategy. 
bar | 0 
1 file changed, 0 insertions(+), 0 deletions(-) 
create mode 100644 bar 

合并工具叫做:当合并

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 
} 

合并工具,则不会调用不会在其他错误上调用:

$ git merge adasds 
fatal: adasds - not something we can merge 
+0

这不是让git自动打开mergetool,这是让shell做到这一点。 – 2013-07-17 16:36:48

+0

为什么downvote?这实际上是一个更清晰的方式来实现rosipov的答案。 – onionjake 2013-07-17 21:13:50

+0

它是如何更清洁?你错过了一些冲突(比如'git stash pop')。由于他不是靠命令过滤,这不是问题。正如你注意到的那样,当前的代码将在1状态的任何错误上启动'git mergetool'。 – 2013-07-17 22:35:37