如何讓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. 合併衝突Git
- 6. 如何看到自動合併merge = union在git後衝突
- 7. git blame在解決合併衝突時
- 8. 在持續集成中自動合併Git,但在合併衝突時失敗
- 9. 在Git中如何合併衝突與在Subversion中合併衝突?
- 10. 解決合併衝突時,Git能自動處理插入嗎?
- 11. 如何處理合並衝突 - Git的
- 12. 如何解決git合併衝突?
- 13. 如何用git pull合併文件時修復git衝突?
- 14. Git合併衝突的文件時拉
- 15. SVN合併,並自動解決衝突
- 16. 如何使融合作爲git mergetool只顯示衝突,而不是差異?
- 17. rebase衝突,在git中合併提交
- 18. 在Git中合併衝突案例
- 19. Git:揭示潛在合併/ rebase衝突
- 20. Git:合併衝突並提交消息
- 21. 無法自動合併Git拉請求::沒有衝突
- 22. tf解決衝突合併自動
- 23. 自動解決主鍵合併衝突
- 24. 與MercurialEclipse合併時,在命令行合併時會自動解決衝突
- 25. git mergetool沒有3路合併正確
- 26. Git忽略剩餘的合併衝突
- 27. git合併分支不給衝突
- 28. Git:錯誤的合併衝突?
- 29. Git合併衝突BASE中的Tabbing
- 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