如何让git自动运行git mergetool
以解决任何合并冲突?这应该适用于所有的合并,使用merge
,rebase
,pull
等如何让git在合并冲突时自动打开mergetool?
回答
你总是可以使用别名
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中的“如何解决冲突”)。
正如我所提到的,如果发生冲突,我只想调用'mergetool'。 “合并的几种方式中只有一种”的说法并不令人信服。是的,有多种方式,但想要选择一种作为默认是合理的。 – 2012-04-05 17:51:54
如果没有冲突,git mergetool将不会执行任何操作。 – j13r 2012-04-05 18:17:41
它将打印一条消息。 – 2012-04-05 18:27:19
据我所知,没有瓷器的做法。
你可以有大约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
)是在所得的命令的列表合并冲突(pull
,merge
等)。否则,如果git命令输出太长,您将最终解析大量不必要的数据。
是否有可能没有有效别名混帐? – 2013-07-13 11:56:25
@QuinnStrahl你可以命名脚本'git'(没有文件扩展名),并放在你的路径之前的实际git可执行文件。但它几乎是另一种别名方式。所以不,我不知道有一种方法可以在不混淆git的情况下实现。 – 2013-07-13 16:54:15
应该有点可行,但CONFLICT正则表达式需要改进。我认为它现在会在任何地方捡起它,甚至在例如。差异输出。至少您可以按行位置过滤(例如锚点),也可以展开文本。 – 2013-07-17 22:37:07
你还不能让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
这不是让git自动打开mergetool,这是让shell做到这一点。 – 2013-07-17 16:36:48
为什么downvote?这实际上是一个更清晰的方式来实现rosipov的答案。 – onionjake 2013-07-17 21:13:50
它是如何更清洁?你错过了一些冲突(比如'git stash pop')。由于他不是靠命令过滤,这不是问题。正如你注意到的那样,当前的代码将在1状态的任何错误上启动'git mergetool'。 – 2013-07-17 22:35:37
- 1. Git冲突 - mergetool未配置
- 2. 合并冲突Git
- 3. Git合并冲突
- 4. Git合并(冲突)
- 5. 如何看到自动合并merge = union在git后冲突
- 6. git blame在解决合并冲突时
- 7. Git:合并冲突并提交消息
- 8. 自动解决主键合并冲突
- 9. Windows上的Git GUI:合并冲突
- 10. Git合并冲突BASE中的Tabbing
- 11. Git合并覆盖而不是冲突
- 12. 避免与git合并冲突
- 13. Git颜色合并/底线冲突
- 14. 成功合并后Git rebase冲突?
- 15. git合并与.class文件的冲突
- 16. 合并冲突的Git钩子
- 17. 如何在git中合并分支中的冲突文件?
- 18. git:如何让合并冲突的“我们的,他们的,原创的”?
- 19. 在使用补丁时合并git中的冲突
- 20. 为什么我在恢复时遇到git合并冲突?
- 21. Git合并后合并打开VIM
- 22. 如何在git中合并和更新文件时解决冲突?
- 23. 合并移动的分支时如何避免树冲突?
- 24. 合并冲突Gemfile.lock
- 25. libgit2:合并冲突
- 26. Github合并冲突
- 27. DevelopmentServerPort合并冲突
- 28. svn合并冲突
- 29. TFS合并冲突
- 30. 自动git合并
也许你可以使用[githook](http://www.kernel.org/pub/software/scm/git/docs/githooks.html),例如, '后结账'(我不知道它是否真的在合并过程中被调用过,'合并后'需要成功合并) – 2012-08-03 08:35:56
@TobiasKienzler你可能会做某事。如果你能找出一个工作解决方案,我会给你这个问题的赏金。 – 2013-07-14 23:03:13
@QuinnStrahl我不认为目前存在一个钩子,在每个导致合并的各种命令之前执行,所以[rospov的包装](http://stackoverflow.com/a/17620046/321973)可能是最简单的解决方案或者修改git源代码以实现'预合并'钩子功能,在这种情况下,你当然可以简单地使用git在冲突上运行mergetool,具体取决于配置设置...... – 2013-07-15 07:54:46