在 kDiff3 中完成合并后如何触发自动命令?

How can I trigger automated command after completing a merge in kDiff3?

假设我正在进行变基(交互式或其他方式),并且检测到合并冲突。

合并停止,我 运行(在命令行上)git mergetool,已配置为使用 kdiff3 作为其合并管理器。

我在 KDiff3 界面中选择了我的合并分辨率,并准备继续。

在某个时候之后,之前“我现在已经提交了合并的更改(并且我将继续下一次提交)”,我想执行自定义命令 w.r.t。结果文件的当前状态。

有什么地方可以让我自动挂钩吗? 在 git 本身或 kDiff 中。


其他点的类似挂钩是 git 中的 textconv 命令挂钩,或 KDiff3 中的预处理命令。

对“获取文件路径的命令”(如 textconv)或“将文件的当前状态通过管道传输到其中的命令”(如 kDiff 预处理器)感到满意。

信用: 所有这些都是@Joachim 的想法,在他对上面我的问题的评论中。

如何实际实现这一点的细节主要来自这里:https://blog.beardhatcode.be/2018/03/your-own-git-mergetool.html,它提供了很多关于合并脚本的“命令界面”是什么样子的见解。


根据@Joachim 的建议,您可以通过在您自己的脚本中包装 kdiff exe 来实现此目的,该脚本还执行 post-merge 操作,然后设置 那个作为合并工具。

可以在我的 Github 中找到实现此解决方案的完整详细信息: https://github.com/Brondahl/AzureAdfDataflowGitPrettifier

最有趣的文件是:

总的来说,这是一个解决方案,用于在每次差异或比较操作之前(无损地)美化我的存储库中特定文件类型的所有实例,然后(再次无损地)在任何写入后再次对其进行丑化使用此美化版本的操作...实际上只是 kdiff3 合并。


其中最关键和特定主题的步骤可能是:

在 kdiff-wrapping bash 脚本中:

  • kdiffPath=$(git config --get mergetool.kdiff3.path)为了得到当前的kdiff路径
  • applyPreProcessorConfig="PreProcessorCmd=.\dataflowGitDiffTool\AdfDataflowFilePrettifier.exe -prettify -fromStdIn" 我们将在调用它时传递给 kdiff,告诉它使用美化器
  • invokeKDiff=("$kdiffPath" "$@" "--cs" "$applyPreProcessorConfig") 后跟 "${invokeKDiff[@]}" 以便成功将脚本 ($@) 中的所有参数传递给 kdiff。
  • mergeOutput= 为了知道现在美化的 post-merge 输出文件是我们应该丑化的地方。

然后配置我的 git 配置以适当地使用脚本:

git config merge.tool kdiff3_with_uglification
git config mergetool.keepBackup false
git config mergetool.kdiff3_with_uglification.cmd './dataflowGitDiffTool/kdiff3_with_uglification.sh "$BASE" "$LOCAL" "$REMOTE" -o "$MERGED"'

生成一个 .git\config 文件,如下所示:

[merge]
    tool = kdiff3_with_uglification
[mergetool]
    keepBackup = false
[mergetool "kdiff3_with_uglification"]
    cmd = ./dataflowGitDiffTool/kdiff3_with_uglification.sh \"$BASE\" \"$LOCAL\" \"$REMOTE\" -o \"$MERGED\"