【发布时间】:2011-05-09 12:23:21
【问题描述】:
我打算编写一些 git 钩子作为一个项目,将用户的操作记录在数据库中。然后可以使用该数据库查询他的所有活动。我尝试记录的操作是
- 提交
- 拉
- 推
- 合并
- 分支
我想把它打包到发行版中,可以通过包管理器安装。
Git 允许通过在 $PREFIX/share/templates/hooks 中放置任何此类钩子来实现全局钩子
它目前有一些被禁用的钩子(.sample 附加到它们的名称后)。创建新存储库时,会将这些钩子复制到存储库的.git 文件夹中
现在,如果用户为这些钩子安装软件包,并且像 post-commit 和 post-update 这样的钩子已经启用。在这种情况下,脚本文件将被覆盖!这听起来很糟糕
这意味着 git 每个动作只有一个钩子文件。如果我需要为一个动作保留三个钩子,这意味着它是不可能的。这意味着从包管理器自动安装可能会引入冲突。
现在认为我们打包了钩子来覆盖默认启用的文件。如果用户想在这些文件中添加更多操作,然后决定卸载我的包,那么他的自定义命令也会消失吗?
我认为 git 在这方面非常聪明,我错了:(
需要有一个名为 post-commit 和 post-update 的文件夹,或者任何操作,git 应该运行该文件夹内的所有脚本。我仍在寻找应对当前情况的方法。
【问题讨论】:
-
你可能会看看这个question about tracking git hooks - 我发布了一个将符号链接安装到 hooks 目录的准系统实现,它运行适当的 hooks - 它很容易扩展到多个 hooks 用于同一任务,并且还允许用户留下自己的本地钩子。
-
注意:一个简单的“运行脚本列表”不会对所有钩子类型正常工作,因为它们中的一些希望在标准输入上接收数据(例如 pre-receive、post-receive、post-改写);在大多数天真的实现中,第一个运行的脚本将获取所有数据,其余的将一无所获(EOF)。它可能会捕获一次数据并将其提供给每个脚本,但这可能不适用于所有脚本/情况。
-
杰弗罗米,谢谢。这看起来很好,符号链接可以成为一个解决方案,但问题是如何在每台机器上修补 git,以便 git init 将钩子符号链接复制到文件夹?有什么好的例子吗?
-
克里斯,我认为采用标准输入并将其传递给所有脚本可能是一个更好的解决方案。