Gitdebugging自定义合并驱动程序

我正在创build一个自定义合并驱动程序。 一切似乎都在一些用例下工作; 然而,在一个特定的一个我正在合并:“致命:自定义合并驱动程序用户缺乏命令行”。 我只能假设我的自定义合并驱动程序正在退出与0以外的东西。

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

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

TL; DR总结

您必须在一些Gitconfiguration文件中至less有两行读取,例如:

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

没有之前或之后的一行(在同一个Gitconfiguration文件的同一部分):

  driver = some string, preferably with %-escapes 

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

您还必须在.gitattributes文件中至less有一行读取:

 name-or-pattern merge=users 

然后,您必须调用一个合并,该合并涉及与左侧的名称或模式相匹配的文件path名。

说明

该消息本身来自ll-merge.c围绕192行 :

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

(顺便说一句,“ll”代表“低级”:这是“低级合并”代码,低级合并是在每个文件的基础上完成的。)由于其他错误检查,这个特定的条件, fn->cmdline == NULL – 只有在出现至less一次merge.users. whatever发生merge.users. whatever merge.users. whatever在任何configuration文件Git已经读取。 (在其他各种情况下,您可能会遇到其他一些错误,但这些并不是您正在查找错误的机器人 。)

请记住有三个这样的文件(系统,全局和本地)。 他们按顺序阅读:系统第一,然后是全球,然后是本地。 这些文件中的任何一个或全部三个都可以包含部分或完全定义自定义合并驱动程序的行; 所有三个文件的设置将按照它们发生的顺序进行应用,其后的设置通常会覆盖之前的设置。

这是如何以及为什么本地设置通常覆盖全局设置。 有一些情况下,设置积累,而不是压倒一切。 对于自定义合并驱动程序,整体效果是一个奇怪的混合: 驱动程序merge. name . whatevername部分merge. name . whatever merge. name . whatever merge. name . whatever累积的,还是个人的设置 – 任何一个merge. name . whateverwhatever部分merge. name . whatever merge. name . whatever merge. name . whatever被覆盖,如果他们不止一次发生!

接下来,请参阅read_merge_config() ,同一个文件的第232-296行 :这意味着每当merge.users. whatever merge.users. whatever读取merge.users. whateverstruct ll_merge_driver根据需要创build一个types为struct ll_merge_driver的数据结构,或者如果存在,则会重用使用名称users的现有数据结构。 variablesfn指向这个结构; fn->nameusersfn->fnll_ext_merge() (后者是调用外部合并驱动程序的C代码函数,并且是find上面引用的两行的地方)。

read_merge_config()中的其余一些行检查文字stringnamedriver 。 对于后者( driver ),代码用指定的值填充fn->cmdline字段。

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

  • 你已经运行(直接或间接) git merge或调用git merge的命令(例如, git cherry-pickgit revertgit rebasegit apply -3 ,例如);

  • 基于所有三个input(合并基础和两个提示提交),某些文件F需要完整的三路“低级”合并,因为它在三个input中具有三个不同的散列ID; 和

  • 文件F.gitattributes包含行merge=users

在这个时候(甚至没有其他的时候),Git实际上调用ll_ext_merge ,在读取三个Gitconfiguration文件(系统,全局和本地)的同时,传递它创build并填充的数据结构(部分或全部)。

既然你现在得到了你得到的错误信息,我们知道:

  • 在这三个configuration文件中,至less存在一次merge.users. whatever merge.users. whatever ,但是
  • 没有whateverdriver

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