Git调试自定义合并驱动程序

时间:2017-06-28 14:18:27

标签: node.js git merge

我正在创建自定义合并驱动程序。一切似乎都在许多用例下工作;但是,在合并期间我得到的一个特定的:“致命:自定义合并驱动程序用户缺乏命令行。”我只能假设这意味着我的自定义合并驱动程序正在退出0以外的其他东西。

我在node.js中编写合并驱动程序,它在我的机器上作为全局包安装。 .gitconfig和.gitattributes似乎设置正确,因为我期望它使用合并驱动程序。

当我进行自己的测试(手动指定3个文件)时,我是console.log的一些调试信息,但似乎在运行时使用GIT合并时,这些控制台消息会受到抑制。无论如何,我可以从我的自定义合并驱动程序中看到一些调试信息,因为git实际上正在使用它吗?

1 个答案:

答案 0 :(得分:2)

TL; DR摘要

在某些Git配置文件中,您必须至少有两行读取,例如:

[merge "users"]
    any-variable-not-named-driver = any-value

没有表单的前一行或后续行(在同一Git配置文件的同一部分中):

    driver = some string, preferably with %-escapes

请注意,当任何人(包括外部程序)运行git somecommand时,最多会读取三个此类配置文件。一个是系统范围的(通常为/etc/gitconfig),因此任何给定计算机上的所有用户都可以看到具有相同内容的同一文件。一个文件是每位用户,可在$HOME/.gitconfig$XDG_CONFIG_HOME/git/config中找到。最后一个文件是per-repository,位于$GIT_DIR/config,其中$GIT_DIR默认为当前工作目录或其上方的第一个.git目录。

您还必须在.gitattributes文件中至少有一行内容为:

name-or-pattern    merge=users

然后,您必须调用涉及与左侧名称或模式匹配的文件路径名的合并。

解释

消息本身来自ll-merge.c around line 192

if (fn->cmdline == NULL)
    die("custom merge driver %s lacks command line.", fn->name);

(顺便提一下," ll"这里代表"低级":这是"低级别合并"代码,低级别合并在a上完成每个文件。)   由于其他错误检查,此特定条件 - fn->cmdline == NULL - 只有在Git读取的任何配置文件中至少出现merge.users.whatever时才会出现。 (在其他各种情况下你可能会得到一些其他错误,但那些不是你正在寻找错误的机器人。)

请记住,有三个这样的文件(系统,全局和本地)。按顺序读取它们:首先是系统,然后是全局,然后是本地。这些文件中的任何一个或全部三个都可以包含部分或完全定义自定义合并驱动程序的行;所有三个文件的设置都会以它们出现的顺序被应用,以后的设置通常会覆盖先前的设置。

这是本地设置如何以及为何通常会覆盖全局设置。在某些情况下,设置会累积,而不是覆盖。对于自定义合并驱动程序,整体效果是一种奇怪的混合:来自name驱动程序 - merge.name.whatever 部分 - 累积,但个人< em> settings -the whatever 部分给予merge.name.whatever任何一个 - 如果它们出现多次,则被覆盖!

接下来,请参阅read_merge_config(), lines 232-296 of the same file:这意味着每当读取merge.users.whatever时,必要时会创建类型为struct ll_merge_driver的数据结构,或者如果存在,则创建现有的数据结构名称users被重复使用。变量fn指向此结构; fn->nameusersfn->fnll_ext_merge()(后者是调用外部合并驱动程序的C代码函数,并且是找到上面引用的两行的位置)。

read_merge_config()中的其余部分行检查 whatever 是否为文字字符串namedriver。对于后一种情况(driver),代码会使用指定值填充fn->cmdline字段。

要使用ll_ext_merge()作为用户定义的合并驱动程序的名称来调用users本身,必须满足以下三个条件:

  • 您已经(直接或间接)git merge或调用合并的命令(例如git cherry-pickgit revertgit rebase或{{1例如);

  • 基于所有三个输入(合并基础和两个提示),某些文件 F 需要一个完整的三路&#34;低电平&#34;合并,因为它在三个输入中有三个不同的哈希ID;以及

  • 文件 F git apply -3包含第.gitattributes行。

此时(并且没有其他时间),Git实际上调用merge=users,在读取三个Git配置文件(系统,全局,同时)时,传递创建和填充的数据结构(无论是部分还是完全)和当地的。)

由于您现在收到了错误消息,我们知道:

  • 在三个配置文件中,至少出现一次ll_ext_merge,但
  • merge.users.whatever没有whatever

这就是我在这个答案的顶部得出结论的方式。