2012-04-05 100 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