0

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

我想通过保留两个版本的文件中的所有行来合并这两个分支(理想情况下触发每个文件上的合并工具)。

到目前为止我做了什么:

我在工作树的根目录中创建了一个 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 文件是否确实为所有文件设置了合并属性:

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

但是,我的脚本没有被执行(我添加了 echo 只是为了确保)。相反,执行正常的 git 合并,将其他分支的内容留给我。我怎样才能正确地做到这一点?

编辑:更多信息:

这是历史

    A --- B ------- D(主)
           \ /
            ---C---(工具栏)

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

4

1 回答 1

0

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

标准的工作流程是你做一个git merge,然后当有冲突时 git 会告诉你关于它的事情,所以你决定如何解决问题。然后,如果您说它git mergetool会询问您使用哪个工具来解决它。union-merge如上所述设置您之后,应该只需要简单ENTER地调用您的脚本并对这些文件进行自定义处理。

于 2013-05-27T11:06:29.710 回答