Git全局钩子定制

Git全局钩子定制,git,scripting,githooks,Git,Scripting,Githooks,我计划编写一些git钩子作为一个项目,将用户的操作记录在数据库中。然后可以使用该数据库查询his的所有活动。我试图记录的操作是 承诺 拉 推 合并 分支机构 我想把它打包成发行版,可以通过PackageManager安装。 Git通过在$PREFIX/share/templates/hooks 它当前有一些已禁用的钩子(.sample附加在它们的名称后面)。创建新存储库时,这些挂钩将复制到存储库的.git文件夹中 现在,如果用户为这些钩子安装了包,那么像post-commit和post-up

我计划编写一些git钩子作为一个项目,将用户的操作记录在数据库中。然后可以使用该数据库查询his的所有活动。我试图记录的操作是

  • 承诺
  • 合并
  • 分支机构
我想把它打包成发行版,可以通过PackageManager安装。 Git通过在
$PREFIX/share/templates/hooks

它当前有一些已禁用的钩子(
.sample
附加在它们的名称后面)。创建新存储库时,这些挂钩将复制到存储库的
.git
文件夹中

现在,如果用户为这些钩子安装了包,那么像
post-commit
post-update
这样的钩子就已经启用了。在这种情况下,脚本文件将被覆盖!这听起来很糟糕

这意味着git每个操作只有一个钩子文件。如果我需要为一个动作保留三个钩子,这意味着这是不可能的。这意味着从package manager自动安装可能会引入冲突

现在,我们将钩子打包为覆盖默认启用的文件。如果用户希望向这些文件添加更多操作,然后决定卸载我的软件包,那么他的自定义命令也将消失

我认为git在这方面相当聪明,但我错了:(


需要有一个名为
post-commit
post-update
的文件夹,或者任何操作,git都应该运行该文件夹中的所有脚本。我仍在寻找解决当前情况的方法。

为什么不编写一个post-commit钩子(例如)来查找“post-commit钩子”并将列出并执行在其中找到的所有脚本?
(第一个未成功运行的将使所有后期提交挂钩失败)


如果用户初始化了他们的脚本,那么您可以确保他们在新的repo中都获得了这些特殊脚本。

您可以看看这个-我发布了一个将符号链接安装到hooks目录的基本实现,该目录运行适当的钩子-它很容易扩展到同一任务的多个钩子,并且还提供了用户留下他们自己的本地钩子。注意:对于所有钩子类型,简单的“运行脚本列表”将无法正常工作,因为他们中的一些人希望在stdin上接收数据(例如,预接收、后接收、后重写);在大多数幼稚的实现中,运行的第一个脚本将获取所有数据,其余的将一无所获(EOFs)。一次捕获数据并将其提供给每个脚本可能有效,但这可能不适用于所有脚本/情况。Jefromi,谢谢。符号链接似乎是一个解决方案,但问题是如何在每台机器上修补git,以便git init将符号链接复制到文件夹?有好的示例吗?Chris,我认为使用stdin并将其传递给所有脚本可能是一个更好的解决方案。我认为,如果第一个脚本失败,进程不应该停止。如果其中一个脚本失败,是否有停止所有其他脚本的特殊原因?是的,如果用户从预定义目录初始化模板,问题就会出现。在这种情况下,我的个人脚本或安装从包装中扣除的费用不能包含在此类费用中。