我怎么能强制mergetool GUI(KDiff3)总是显示?

时间:2013-03-10 10:59:02

标签: git git-merge kdiff3 mergetool

如何强制始终显示mergetool GUI并禁用任何自动解析?

有时当合并期间出现冲突并且我使用mergetool时,它会在我点击 Enter 之后立即返回“点击返回以启动合并解析工具(kdiff3)” 并且未显示任何GUI,并且冲突似乎已得到解决。

我让Git配置为现在使用KDiff3作为mergetool,但是当我将codecompare指定为mergetool时也会发生这种情况。我知道在KDiff3中有一个选项“自动保存并退出合并而不会发生冲突”,这理论上可能导致所描述的行为,但我一直禁用/取消选中此选项。

此外,在Git mergetool gitconfig中直接有 trustExitCode 选项,我将其设置为true,但即使我将其设置为false,也不会显示GUI。

我不确定是谁自动解决了。某些预处理中的Mergetool还是KDiff3?

我在Windows上运行并安装了Git扩展程序。

KDiff3特有的类似问题也在这里被问到: Kdiff3 won't open with mergetool command

5 个答案:

答案 0 :(得分:31)

Git已将--auto硬编码为KDiff3的命令行选项,如果所有冲突都可由KDiff3自动解析,则会导致GUI无法显示。在KDiff3设置中,您可以指定要忽略的命令行选项,但将--auto放在那里对我来说不起作用。

作为一种解决方法,我将自己的KDiff3变体配置为合并工具:

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

这与Git默认使用的KDiff3非常类似,但没有--auto标志。

现在,您可以全局调用git mergetool -t kdiff3NoAuto或将kdiff3NoAuto配置为mergetool,并在解决冲突时始终显示KDiff3。

关于问题的第二部分,如果您确实要禁用任何自动解析,只需将--qall添加到上面的kdiff3命令行即可。但是,您必须手动解决文件中的所有更改,即使是那些不会导致Git冲突的更改。最好的方案是:KDiff3显示Git如何合并文件并让冲突保持开放供用户选择。

答案 1 :(得分:3)

Bob esponja对接受的答案的评论使用KDiff3 0.9.98对我来说非常有效。

--auto添加到要忽略的命令行选项:

Settings | Configure KDiff3... | Integration tab.

KDiff3带有“冲突”对话框,指示未解决的冲突数:0 ,但是您可以根据需要检查/修改合并状态。

比配置您自己的变体要方便一些,因为无论从git mergetool,Source Tree还是任何使用mergetool的工具,它都可以按预期工作。

答案 2 :(得分:1)

git mergetool的行为完全取决于所选的合并工具以及命令行Git传递给它。因此,要更改其行为,您需要找到执行所需操作的命令行并配置Git以使用该命令行。

我自己有这个问题(特别是关于KDiff3),PiQuer's answer让我参与其中,但它让我思考。应该有一种方法可以为KDiff3完全复制Git的默认行为,除非没有--auto选项(这是导致KDiff3不显示GUI的原因)。

看起来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"

Git文档中没有明确提到base_presentmerge_tool_path变量可以在mergetool.<tool>.cmd中使用,因此将来某些时候可以使用此命令不按原样工作。但是,可以使用命令轻松替换它们,以测试BASE是否指向存在的文件,以及KDiff3的硬编码路径。

请注意,上面的命令替换了Git的kdiff3合并工具的默认命令,而不是创建单独的命令。

关于原始问题中的其他几点:

  • trustExitCode设置告诉Git合并工具的退出代码是否是合并是否成功的正确指示。一旦合并工具退出,它不会影响合并工具的行为,而是影响Git的行为。请参阅manual for git-mergetool
  • 键入git mergetool后您看到的自动分辨率全部由合并工具本身完成。 git mergetool仅在需要合并的文件版本上调用外部工具。

答案 3 :(得分:0)

不是配置仅在发生冲突时调用的mergetool,而只需使用KDiff3设置合并驱动程序:

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

答案 4 :(得分:0)

如果问题完全与不需要的冲突自动解决有关...

打开KDiff3后,只需按菜单中的Merge / Set Deltas to Conflicts,状态就会更新为一个漂亮的,由人为驱动的冲突解决问题。