我已经编写了一些自己的代码以干净地合并某些二进制文件类型。我试图通过在.gitconfig中添加带有驱动程序的合并命令行并在.gitattributes中添加文件表达式以指向我的合并程序来添加自己的合并策略。
它有效-如果我对该文件类型执行git merge,它将调用我的程序-如果我以1退出则失败,并说存在冲突-如果0则成功。
但是-我找不到有关如何获取参数的任何文档-即我如何知道正在合并的文件-正在与哪个文件进行合并等。它们不会作为环境变量进入...我我知道可以在驱动程序命令行上放置一些变量,但是经过反复试验,$ PWD是我发现的唯一可行的变量。
谁能指出我有关如何编写自定义合并策略的任何文档?
答案 0 :(得分:5)
此答案分为两部分,因为您所描述的不是合并策略,而是合并驱动程序。
我认为没有任何适当的文档。只有源代码。不过,由于GIT_TRACE
计算了一些信息然后运行git merge
或git-merge-recursive
或其他任何{{ 1}}您已选择。如果您编写自己的git-merge-octopus
命令并运行-s <strategy>
,则可以查看参数。
您的合并驱动程序以the gitattributes documentation中所述的方式调用(搜索定义自定义合并驱动程序)。 git-merge-oakey
字符替换将填充各种参数。就像说的那样,无论您在何处写入git merge -s oakey
,%
或%O
,Git都将填写一个临时文件的名称,该文件保存来自适当索引阶段的数据(复制到工作树中的普通文件)。您应该覆盖%A
命名的文件。
我怎么知道正在合并的文件...
您不知道(也无法确定)正在合并哪个文件名;您只需要使用三个输入内容 即可完成您的工作。最终,无论如何不一定要有一个文件名:Git可能在合并的一侧检测到重命名,因此该文件在合并基础和一侧分别命名为%B
,而{{1 }} 另一方面。 (作为Hasturkun noted in a comment,%A
占位符将扩展到Git将用作最终路径名的最佳猜测的任何名称。请勿将其用作合并过程的三个输入之一,但是-这三个输入位于foo
,bar
和%P
文件中。)