【问题标题】:How husky works?哈士奇的工作原理是什么?
【发布时间】:2019-12-09 08:49:32
【问题描述】:

https://github.com/typicode/husky 能够自动运行 git 挂钩,以便在自己的存储库中的团队之间共享它们。

这怎么可能?由于钩子需要在.git/hooks 中,它没有添加到存储库中。

它是否包装git 命令并拦截命令,并在它们发生时运行钩子?

我想在不需要依赖 npm 或 node 的情况下为 python 和 php 项目重现这种行为。

【问题讨论】:

  • 你看过源代码吗?我不是 javascript 专家,但在我看来,husky 会在您安装钩子时安装它。
  • 我正在尝试。在github.com/typicode/husky/blob/…
  • 似乎在上面的链接中复制了createHook 的钩子。这似乎发生在npm install 时间而不是git clone。如果我想让它在 python 或 php 项目上运行,我需要在 pip 包或 composer 包中使用类似的东西

标签: git githooks husky


【解决方案1】:

从版本 5 开始,husky 准确地说是使用 git 的 core.hooksPath git config core.hooksPath .husky。这是在husky install 步骤中完成的。

由于husky install 创建的.husky 文件夹包含pre-commit 脚本,因此它将在提交之前运行。 默认情况下,它会包含npm test,但您可以根据自己的意愿对其进行编辑。

你可以在任何项目中做类似的事情。只需在其中添加 .githooks 文件夹和挂钩文件(检查 .git/hooks 以获取示例文件)。但是您必须在克隆存储库(或第一次设置挂钩)时运行git config core.hooksPath .githooks。您可以使用一些初始化脚本来执行此操作。
npm 具有 scripts.prepare,它可以在 npm install(在本例中为 husky install)上运行命令。

【讨论】:

    【解决方案2】:

    在安装 husky 依赖项时(通过npm installnpm add huskyyarn install、...)在 .git/hooks 目录中创建/更新 git 挂钩。如果挂钩是通过 git 命令触发的,则会触发来自 husky 的脚本,该脚本将根据您用于安装的包管理器执行命令。如果你使用 npm npx --no-install husky-run $hookName "$gitParams" 会被执行。该命令查看您的配置并执行为钩子定义的命令。

    它就像 git hooks 的代理。代理安装一次,每次都由普通的 git 钩子执行。如果它被执行,它会查看配置并执行其中定义的命令。

    【讨论】:

    • 感谢您的回答。这很有趣,安装东西会运行任意代码,这是一个潜在的安全风险。我问是因为我试图用纯 git 重现这种行为,但这是不可能的。最后我找不到在克隆时将钩子复制到 .git/hooks 的方法,所以我将它们放在自述文件中并让用户手动安装它。再次感谢
    • @geckos:是的,存在一定的安全风险。但话又说回来:检查和构建 any 软件存在潜在的安全风险,因为几乎所有构建系统都允许执行任意外部命令(即任意代码执行)。所以无论如何你都不应该构建不受信任的软件。
    猜你喜欢
    • 2010-11-30
    • 1970-01-01
    • 2021-01-07
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    相关资源
    最近更新 更多