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

How can I use husky to check a git commit message format?

我正在尝试执行 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 的测试项目的屏幕截图,commit-msg 挂钩及其给出的错误。

相同的挂钩,放在 .git/hooks 文件夹中,工作正常。

issue 81

首先检查

npm config get ignore-scripts # should be false

然后在 git 回购中:

npm install husky --save-dev

然后您可以将挂钩(这里是 pre-commit 和 pre-push)添加到 npmpackage.json),这些挂钩定义的想法是 package.json 文件(git 回购源的一部分)。

尽管 Ron Wertlen npm 脚本除了 build/package 之外的任何内容都是 anti-pattern.
有关更好的做法,请参阅 Jerry Zheng's

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

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

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

add "commitmsg": "validate-commit-msg" to your npm scripts in package.json.

像这样:

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

然后,试一试...

似乎一切正常。

这是为了 commitlint 集成 as per the docs:

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

很有可能;你可以很容易地用这样的东西来定制它:

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

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

#!/usr/bin/env sh
. "$(dirname -- "[=10=]")/_/husky.sh"

message="$(cat )"
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