如何使用 Husky 检查 Git 提交信息的格式?

29

我试图制定一个git提交信息策略,以保持我的存储库整洁和清晰。我已经看过有关服务器端和客户端挂钩的官方文档,然后我发现了husky

到目前为止,我已经能够使用第一个,但无法设置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 and commit-msg hook in a test project

这是一个测试项目的截图,显示了package.json、commit-msg钩子以及它给出的错误信息。
将相同的钩子放在.git/hooks文件夹中,可以正常工作。
4个回答

18

使用 Husky 7+,您可以将以下内容添加到 .husky/commit-msg 文件中:

#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

message="$(cat $1)"
requiredPattern="^(add|cut|fix|bump|make|start|stop|refactor|reformat|optimise|document|merge) .*$"
if ! [[ $message =~ $requiredPattern ]];
then
  echo "-"
  echo "-"
  echo "-"
  echo " Wrong commit message! "
  echo "The commit message must have this format:"
  echo "<verb in imperative mood> <what was done>"
  echo "Allowed verbs in imperative mood: add, cut, fix, bump, make, start, stop, refactor, reformat, optimise, document, merge"
  echo "Example: add login button"
  echo "-"
  echo "Your commit message was:"
  echo $message
  echo "-"
  echo "For more information, check script in .husky/commit-msg"
  echo "-"
  exit 1
fi

嘿,你能否请给我完整的指示,我想在我的项目中设置这个配置。 - Pawan Deore
1
安装完 Husky 后,只需按照我写的来就可以了。 - Jöcker
嘿,谢谢你的回复。我按照你说的做了,但是无法将提交信息存储在变量中。我尝试使用echo命令输出它,但是显示为0。有没有其他方法可以获取提交信息,而不是使用$(cat $1)? - Pawan Deore
那么我该如何获取提交信息,因为$1无法工作...如果您有时间,请回复我。 - Pawan Deore

8

请查看问题81

首先,请检查

npm config get ignore-scripts # should be false

然后在 git 仓库中:

npm install husky --save-dev

你可以在npm (package.json)中添加钩子(这里是预提交和预推送),这样做的想法是,这些钩子定义是package.json文件中的版本(git repo源代码的一部分)。
尽管Ron Wertlen 评论说,npm脚本除了构建/打包之外的任何用途都是反模式。请参见Jerry Zheng答案来了解更好的实践方法。

https://camo.githubusercontent.com/89b1f62d0f2f8b73cad2c70faec7b45d9957c41f/68747470733a2f2f692e696d6775722e636f6d2f794844734d32522e706e67

你可以声明现有的常规bash钩子(问题92
{
  "scripts": {
    "precommit": "sh scripts/my-specific-hook.sh"
  }
}

你可以使用validate-commit-msg来验证你的提交信息。

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


首先,非常感谢您的帮助!如编辑中所述,我尝试配置package.json文件,但根本不起作用。我也尝试了validate-commit-msg,但它也不起作用...到目前为止,我可以运行一个脚本(“postinstall”:“sh hooks/setup_hooks.sh”)将我的钩子移动到.git/hooks文件夹中。 - remmargorp
你在哪个操作系统上工作?使用哪个版本的npm? - VonC
@remmargorp 确定:是否可以修改npm test以使其执行更多操作(例如回显)。然后从那里构建您的提交挂钩? - VonC
除了构建/打包之外,使用npm脚本进行任何操作都是一种反模式。答案https://dev59.com/9lgR5IYBdhLWcg3wEZyV#55203979比这个更安全、更优秀。 - Ron Wertlen
@RonWertlen 很好的观点。我已经将您的评论包含在答案中以增加可见性。 - VonC
显示剩余6条评论

5

像这样:

首先,在你的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",
     ....
  }
 }
}

然后,试一下...

一切看起来都没问题。


2
这不会将参数传递给 my-specific-hook.sh - mjakic
1
@mjakic husky 会将一些参数传递给你的脚本,具体请见这里:https://www.npmjs.com/package/husky#access-git-params-and-stdin - Samuel Mburu

3

根据文档,这是用于commitlint集成的:

# 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'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接