2013-03-10 52 views
27

我該如何強制mergetool GUI始終顯示並禁用任何自動解析?如何強制mergetool GUI(kdiff3)始終顯示?

有時,當有合併過程中發生衝突,我使用合併工具,它只是immediatelly返回後,我打的問題進入「回車,啓動合併解決工具(kdiff3)」並沒有圖形用戶界面顯示和衝突似乎得到解決。

我有git配置爲現在使用kdiff3作爲mergetool,但它也發生時,我有codecompare作爲mergetool指定。我知道有一個選項「自動保存並退出沒有衝突的合併」 in kdiff3,這在理論上可能會導致所描述的行爲,但我一直禁用/未選中此選項。

此外,還有trustExitCode在git的合併工具gitconfig,這是我設置爲true,但即使我將它設置爲false,沒有顯示GUI直接選擇。

我不確定是誰自動解析。 Mergetool在某些預處理或kdiff3中?

我在Windows上運行並安裝了Git擴展。

具體到kdiff3呈三角問題,有人問也在這裏:Kdiff3 won't open with mergetool command

回答

31

Git有--auto硬編碼爲命令行選項來kdiff3,使GUI不顯示了,如果所有的衝突都是自動解析由kdiff3。在kdiff3設置中,您可以指定要忽略的命令行選項,但將--auto設置爲不適用於我。

作爲一種變通方法我配置我自己kdiff3的變量作爲合併工具:

git config --global mergetool.kdiff3NoAuto.cmd "kdiff3 --L1 \"\$MERGED (Base)\" --L2 \"\$MERGED (Local)\" --L3 \"\$MERGED (Remote)\" -o \"\$MERGED\" \"\$BASE\" \"\$LOCAL\" \"\$REMOTE\"" 

這非常類似於默認kdiff3使用什麼混帳,但沒有--auto標誌。

現在您可以撥打git mergetool -t kdiff3NoAuto或將kdiff3NoAuto配置爲全局的mergetool,並且kdiff3在解決衝突時總是顯示出來。

更新:關於你問題的第二部分,如果你真的要禁用任何自動解決,只需添加--qallkdiff3命令行以上。但是,您必須手動解決文件中的所有更改,即使是那些不會導致git衝突的更改。最佳方案是:kdiff3顯示了git如何合併文件並且讓用戶選擇的衝突保持開放。任何人都知道如何做到這一點?

+0

Wauu,太棒了。謝謝!你也可以考慮回答相關的問題,或者在那裏寫一些評論評論,因爲它最終可能是完全相同的問題。 – 2013-04-04 19:32:11

+0

謝謝。我在另一個問題中與這個答案有關。 – PiQuer 2013-04-04 22:01:04

+1

將'--auto'添加到被忽略的命令行選項爲KDiff3 0.9.98(64位)工作。設置菜單 - >配置KDiff3 - >集成選項卡。自動解析信息對話框出現,但隨後顯示合併結果,允許進一步編輯。 – 2017-08-07 15:15:19

0

,而不是配置合併工具的被稱爲只有當有衝突,只需安裝一個驅動程序的合併與kdiff:

git config merge.kdiff.driver 'kdiff3 "%O" "%A" "%B" -o "%A" --L1 "Nearest Common ancestor" -L2 "Working Copy" --L3 "Version from Other Branch"' 

可以使這種驅動全球加--global。 但是,你需要在你的回購添加.gitattribute:

* merge=kdiff 
0

git mergetool的行爲是完全依賴於命令行的Git傳遞給它選擇的合併工具和。因此,要改變它的行爲,你需要找到一個你想要的命令行並配置Git來使用該命令行。

我自己有這個問題(特別是關於KDiff3),而PiQuer's answer讓我成爲了一部分,但它讓我思考。除非沒有--auto選項(這導致KDiff3不顯示GUI),否則應該有一種方法可以完全複製Git的默認行爲,而不是使用KDiff3。

它看起來像kdiff3合併工具的默認命令的來源是在文件git/mergetools/kdiff3。這看起來像shell腳本,所以我們應該能夠完全複製它!把上一條線,去除--auto,和逃避的東西給了我們這樣的:

git config --global mergetool.kdiff3.cmd "if \"\$base_present\"; then \"\$merge_tool_path\" --L1 \"\$MERGED (Base)\" --L2 \"\$MERGED (Local)\" --L3 \"\$MERGED (Remote)\" -o \"\$MERGED\" \"\$BASE\" \"\$LOCAL\" \"\$REMOTE\" >/dev/null 2>&1; else \"\$merge_tool_path\" --L1 \"\$MERGED (Local)\" --L2 \"\$MERGED (Remote)\" -o \"\$MERGED\" \"\$LOCAL\" \"\$REMOTE\" >/dev/null 2>&1; fi" 

base_presentmerge_tool_path變量沒有具體的Git的文件中所提及爲可利用的mergetool.<tool>.cmd使用,因此有可能在一些指出未來這個命令可能不會按原樣工作。但是,它們可以很容易地替換爲一個命令來測試BASE是否分別引用了存在的文件和KDiff3的硬編碼路徑。

請注意,上述命令將替換Git的kdiff3合併工具的默認命令,而不是創建單獨的命令。

關於在原來的問題其他幾個要點:

  • trustExitCode設置告訴Git的合併工具的退出代碼是否是合併是否成功適當的指示。它不會影響合併工具的行爲,而是會影響合併工具退出後Git的行爲。請參閱manual for git-mergetool
  • 您在輸入git mergetool後看到的自動分辨率全部由合併工具本身完成。 git mergetool僅在需要合併的文件版本上調用外部工具。