使用union合并所有文件并触发mergetool

时间:2013-05-27 08:58:00

标签: git

我有以下场景:我在一个分支上做了几个提交,然后我使用了一个工具,它在新分支上从UML模型生成代码。不幸的是,这个工具相当愚蠢,不能很好地支持往返生成。因此,我的所有代码都被删除了,只保留了生成的骨架。

我想通过保留文件的两个版本中的所有行来合并这两个分支(并且理想地在每个文件上触发mergetool)。

到目前为止我做了什么:

我在工作树的根目录中创建了一个shell脚本:

#!/bin/sh
echo "union merge"
git merge-file --union "${1}" "${2}" "${3}"
exit 1 # trigger merge conflict

创建.gitattributes文件:

**.cpp merge=mytool
**.h merge=mytool

并编辑了我的.gitconfig:

[merge "mytool"]
name = union merge
driver = ./union-merge.sh %A %O %B

我可以检查.gitattributes文件确实为所有文件设置了merge属性:

$ git check-attr -a src/file.cpp
customn/appopt.cpp: merge: mytool

然而,我的脚本没有被执行(我添加回声只是为了确保)。相反,执行正常的git合并,留下另一个分支的内容。我该怎么做呢?

编辑:更多信息:

这是历史


    A --- B ------- D    (master)
           \       /
            ---C---      (toolbranch)

B ,我已经提交了更改。我从那里创建了一个新的分支,使用上面提到的代码生成器来生成方法骨架(以及它所使用的一些标记注释)。此步骤已删除我在 B 的更改,因为之前的模型基于 A ,我在toolbranch上提交了此代码。现在我想合并回并保留 B C 中的内容,以便能够手动将我的实现插入到方法骨架。这里的问题是git不会将此视为冲突,因为它认为在提交 C 中,合法地删除了行并插入了新的方法框架。

1 个答案:

答案 0 :(得分:0)

嗯,我不确定我的问题是否正确,但基本上合并时不会自动执行mergetool

标准工作流程是您创建git merge,然后在发生冲突时git会告诉您相关信息,以便您决定如何解决问题。然后,如果您说git mergetool,它会询问您使用哪个工具来解决它。如上所述设置union-merge后,只需要一个简单的ENTER即可调用您的脚本并自定义处理这些文件。