如何讓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