如何使用 husky 检查 git commit 消息格式?

Posted

技术标签:

【中文标题】如何使用 husky 检查 git commit 消息格式?【英文标题】:How can I use husky to check a git commit message format? 【发布时间】:2017-06-06 18:14:35 【问题描述】:

我正在尝试执行 git commit 消息策略以保持我的存储库干净整洁。我看过关于服务器端和客户端钩子的官方文档,然后我碰到了husky。

到目前为止,我可以使用第一个,但无法设置哈士奇,我还有很多东西要学。主要思想是能够在新工作站上工作,而无需手动设置任何客户端挂钩。

有人可以解释我如何设置 husky 来检查我的提交消息,甚至举个例子吗?

这是我在 project-root/githooks 文件夹中的 commit-msg 钩子:

#!/usr/bin/env ruby

message_file = ARGV[0]
message = File.read(message_file)

$regex = /([resolved|fixed]) #([0-9])* ([A-Z])\w+/

if !$regex.match(message)  
  puts "[POLICY] Your message is not formatted correctly!"  
  puts "Message format must be like:"  
  puts "resolved #123 Case title (for features)"  
  puts "fixed #123 Case title    (for bugs)"  
  puts "First letter of 'Case title' must be capitalized!"  
  exit 1  
end  

我已经尝试将脚本添加到 package.json:

"scripts":   
  ... : ...,  
  "commitmsg": "sh hooks/commit-msg",  
  ... : ...  
  

钩子不起作用。所有消息都通过。如果放在 .git/hooks 中,它可以正常工作。

这是一个包含 package.json、commit-msg 钩子和它给出的错误的测试项目的屏幕截图。

同样的钩子,放在 .git/hooks 文件夹中,效果很好。

【问题讨论】:

【参考方案1】:

见issue 81

首先,检查

npm config get ignore-scripts # should be false

然后在 git repo 中:

npm install husky --save-dev

然后您可以向npm (package.json) 添加挂钩(这里是预提交和预推送),想法是这些挂钩定义是该 package.json 文件中的版本(您的 git repo 源的一部分)。

尽管,Ron Wertlen comments npm 用于构建/打包之外的任何内容的脚本都是反模式。 请参阅Jerry Zheng 的answer 以获得更好的实践。

您还可以声明现有的常规 bash 挂钩 (issue 92)


  "scripts": 
    "precommit": "sh scripts/my-specific-hook.sh"
  

然后您可以使用validate-commit-msg 来验证您的提交消息。

"commitmsg": "validate-commit-msg" 添加到package.json 中的npm 脚本中。

【讨论】:

首先感谢您的帮助!如编辑中所述,我尝试配置 package.json 文件,但它根本不起作用。我也尝试了 validate-commit-msg,但这也不起作用......到目前为止,我可以运行一个脚本(“postinstall”:“sh hooks/setup_hooks.sh”)来移动我的钩子在 .git/挂钩文件夹。 @remmargorp 您在哪个操作系统上工作?使用哪个版本的 npm? 我在 Ubuntu 16.04 上,npm 是 4.0.5 版 @remmargorp 会将 npm 测试注册为 pre-commit 挂钩工作? (只是为了在调试更复杂的脚本之前回到更简单的测试用例) 我试过 "precommit": "npm test" ,它工作正常。虽然没有设置测试...【参考方案2】:

像这样:

首先,在您的 husky 配置中添加验证脚本:

// package.json

 ...
 "husky": 
  "hooks": 
     "pre-commit": "npm test",
     // if you use validate-commit-msg, this can be "validate-commit-msg"
+    "commit-msg": "sh scripts/my-specific-hook.sh",
     ....
  
 

然后,试一试……

一切似乎都很好。

【讨论】:

这不会将参数传递给my-specific-hook.sh @mjakic husky 将某些参数传递给您在此处详述的脚本 -- npmjs.com/package/husky#access-git-params-and-stdin【参考方案3】:

这是用于commitlint 集成as per the docs:

# Add hook
npx husky add .husky/commit-msg 'npx --no-install commitlint --edit $1'
# or
yarn husky add .husky/commit-msg 'yarn commitlint --edit $1'

很可能;您可以使用以下方式轻松自定义它:

yarn husky add .husky/commit-msg 'sh scripts/my-specific-hook.sh $1'

【讨论】:

以上是关于如何使用 husky 检查 git commit 消息格式?的主要内容,如果未能解决你的问题,请参考以下文章

Git: husky > pre-commit (node v14.16.1)

优化前端工作流:一、使用husky对commit日志校验

Husky v5 不创建 Git 钩子

通过 husky 在 docker 中运行 pre-commit 和 pre-push 命令

如何通过 Git 和 Husky 添加提交钩子并实现代码任务自动化

在Git项目中使用husky统一管理hooks