假设我处于一个rebase(交互式或其他(的中间,并且检测到一个合并冲突。
合并停止,我运行(在命令行上(git mergetool
,它已配置为使用kdiff3
作为其合并管理器。
我在KDiff3接口中选择了合并解决方案,并准备继续。
在之后的和之前的`的某个点上;我现在已经提交了合并的更改(并且将继续进行下一次提交(";,我想执行一个自定义命令,该命令显示生成文件的当前状态。
有什么地方可以让我自动实现这一点吗要么在git本身中,要么在kDiff中。
其他点的类似钩子是git中的textconv
命令钩子,或KDiff3中的预处理命令。
乐此不疲"得到文件路径"的命令;(如textconv
(或";将具有文件的当前状态的命令通过管道传送到其中";(如kDiff预处理器(。
信用:所有这些都是@Joachim的想法,在他对我的问题的评论中,如上所述。
如何实际实现这一点的细节主要来自于此:https://blog.beardhatcode.be/2018/03/your-own-git-mergetool.html,这提供了对";命令接口";因为合并脚本看起来像。
根据@Joachim的建议,您可以通过在自己的脚本中封装kdiff exe来实现这一点,该脚本也执行合并后操作,然后将设置为mergetool
实现这一点的解决方案的全部血腥细节可以在我的Github中找到:https://github.com/Brondahl/AzureAdfDataflowGitPrettifier
最有趣的文件是:
- kdiff3包装bash脚本
- 负责将git配置为的bash脚本使用自定义合并脚本
作为一个整体,这是一个解决方案,用于在每次diff或比较操作之前(无损地(对存储库中某个文件类型的所有实例进行美化,然后在使用此美化版本的任何写入操作之后(再次无损地(再次对其进行美化。。。这实际上只是kdiff3合并
其中最关键和最具体的步骤可能是:
在kdiff包装bash脚本中:
kdiffPath=$(git config --get mergetool.kdiff3.path)
以便获得当前kdiff路径applyPreProcessorConfig="PreProcessorCmd=.\dataflowGitDiffTool\AdfDataflowFilePrettifier.exe -prettify -fromStdIn"
,我们将在调用它时将其传递给kdiff,以告诉它使用pretifierinvokeKDiff=("$kdiffPath" "$@" "--cs" "$applyPreProcessorConfig")
,然后是"${invokeKDiff[@]}"
,以便成功地将脚本($@
(中的所有参数传递给kdiffmergeOutput=$5
,以便知道现在经过修饰的合并后输出文件在哪里,我们应该对其进行丑化
然后以下内容配置我的git-config以适当地使用脚本:
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"'
它生成一个.gitconfig
文件,如下所示:
[merge]
tool = kdiff3_with_uglification
[mergetool]
keepBackup = false
[mergetool "kdiff3_with_uglification"]
cmd = ./dataflowGitDiffTool/kdiff3_with_uglification.sh "$BASE" "$LOCAL" "$REMOTE" -o "$MERGED"