【问题标题】:Git hooks managementGit 钩子管理
【发布时间】:2011-01-04 06:15:03
【问题描述】:

我们在项目中使用自定义编写的 Git 挂钩。

Hooks 存储在项目的存储库中,当它们发生变化时,要获得新版本,每个用户必须手动将它们复制到他的 .git/hooks 目录中。这很不方便。

改善这一点的一种方法是使 .git/hooks 成为工作树的符号链接。但这意味着每个分支(甚至是正在开发的用户本地功能分支)都应该具有最新版本的钩子。这也不方便。

你会如何解决这个问题?

【问题讨论】:

    标签: git githooks


    【解决方案1】:

    为你的钩子和符号链接维护一个单独的存储库。

    我同意,如果 Git 有一个用于传播钩子脚本的内置机制,那就太好了,但它没有。

    【讨论】:

    • 当然,这是一个选项,但这是早上要更新的另一个存储库......对于每个开发人员。我想我需要更多的自动化......
    • 为什么不简单地符号链接到子文件夹呢?
    【解决方案2】:

    http://benjamin-meyer.blogspot.com/2010/06/managing-project-user-and-global-git.html 似乎是一种自动化钩子符号链接的便捷方式,以促进全局、每个用户和每个项目的钩子。

    【讨论】:

    • 这个 github 看起来有点不活跃,但在 https://github.com/git-hooks/git-hooks 有一个更活跃的分支。
    【解决方案3】:

    在 Git 2.9 中,您可以使用 core.hooksPath 配置指向自定义挂钩目录。

    Git 2.9 发行说明 - https://github.com/blog/2188-git-2-9-has-been-released

    提及core.hooksPath - https://git-scm.com/docs/githooks的文档

    注意 - 此问题可能与 Can Git hook scripts be managed along with the repository? 重复

    【讨论】:

      【解决方案4】:

      pre-commit 有很多看起来很有前途的功能

      • 适用于多种语言,并具有插件架构以添加对其他语言的支持
      • 能够引导挂钩依赖项(取决于语言)
      • 以增量方式应用挂钩(仅对提交中的更改运行挂钩)
      • 利用init.templateDir,因此签出的存储库会自动安装正确的挂钩
      • 使用环境变量临时禁用特定挂钩 - 不要因为无法运行其中一项检查而跳过所有检查

      Source code here

      【讨论】:

        【解决方案5】:

        您可以将存储库的 .git 目录设为 git 存储库,只需向其添加挂钩和其他配置,将 objectsrefs 等目录和文件(如 index)添加到其 .gitignore .不仅如此,您还可以设置一个 post-receive 挂钩来更新 metarepo 从其来源。设置好初始配置后,您无需任何额外的努力就可以让它拉入更新。

        我正在研究这方面的细节,比如忽略列表中的内容;我将结果保存在this repo 的分支中。

        【讨论】:

          【解决方案6】:

          对于基于 NodeJS 的项目,我建议你看看 ghooks

          【讨论】:

            【解决方案7】:

            我们将 .git/hooks 作为符号链接到工作树中。

            对于那些需要提交钩子会拒绝的文件的极少数情况,我们使用git commit --no-verify

            【讨论】:

            • 那个 git commit --no-verify 很危险。当你有错误的提交时,很难​​变基。
            • @Alexander,git rebase 也将采用 --no-verify 标志。
            • 谢谢,我错过了。仍然......一个黑客。 :-)
            • 我还是不明白为什么这么危险。
            • 实际上,这意味着挂钩对于共享存储库是正确的,即使我们在本地分支上工作,我们也希望尽早进行这些检查。但有时,我们暂时希望将代码检查到挂钩失败的本地分支中(通常是当树充满调试代码时的“正在进行的”提交,挂钩拒绝)。分支将通过钩子并重新设置以删除“正在进行的”提交,然后再将其推送到上游。你说 hack,我说有时你需要卸下机器的防护装置,然后在其中一个齿轮上插一根棍子。
            猜你喜欢
            • 2020-06-24
            • 2020-12-29
            • 1970-01-01
            • 2017-05-15
            • 2019-09-21
            • 2013-07-17
            • 2012-02-02
            • 2011-05-10
            相关资源
            最近更新 更多