You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Git Commit Hook问题:提交消息验证正常但npm test失败不生效

问题:Git Hook中npm test失败未拦截提交操作

我想用Git Hook同时验证Commit Message格式和执行npm test,目前Commit Message验证功能正常,但npm test执行失败时,提交操作没有被拦截。

期望的Commit Message格式

[FIX-A1325] KEYWORDS : Word1 word2
[FIX-D1325-P4556] KEYWORDS : Word1 word2
[NEW] KEYWORD : Word1 word2
[UPD] KEYWORD : Word1 word2
[DOC] Word1 word2
TMP
[REF] KEYWORD : Word1 word2
[GIT] Word1 word2
[DEL] Word1 word2

当前使用的Hook代码

#!/bin/sh

commitMessage=$(cat $1)

pattern="TMP|\[FIX-A[0-9]+\]\s[A-Z]+\s:\s.+|\[FIX-D[0-9]+-P[0-9]+\]\s[A-Z]+\s:\s.+|\[NEW\]\s[A-Z]+\s:\s.+|\[REF\]\s[A-Z]+\s:\s.+|\[DOC\]\s.+|\[UPD\]\s[A-Z]+\s:\s.+|\[GIT\]\s.+|\[DEL\]\s.+"

if [[ ! "$commitMessage" =~ $pattern ]]; then
    echo "Commit message invalid => $commitMessage"
    exit 1
fi

npm test

解决方案

问题出在你的Hook脚本没有检查npm test的退出状态码。Git Hook仅在脚本以非0状态码退出时才会拦截提交,而当前脚本执行完npm test后,不管结果如何都会默认以最后一条命令的状态码结束——如果npm test失败但后续没有显式退出,脚本可能以0状态码收尾,导致Git判定Hook执行成功,允许提交。

修改后的Hook代码(两种写法任选其一)

写法1:显式检查状态码

#!/bin/sh

commitMessage=$(cat $1)

pattern="TMP|\[FIX-A[0-9]+\]\s[A-Z]+\s:\s.+|\[FIX-D[0-9]+-P[0-9]+\]\s[A-Z]+\s:\s.+|\[NEW\]\s[A-Z]+\s:\s.+|\[REF\]\s[A-Z]+\s:\s.+|\[DOC\]\s.+|\[UPD\]\s[A-Z]+\s:\s.+|\[GIT\]\s.+|\[DEL\]\s.+"

if [[ ! "$commitMessage" =~ $pattern ]]; then
    echo "Commit message invalid => $commitMessage"
    exit 1
fi

# 执行npm test并判断结果
npm test
if [ $? -ne 0 ]; then
    echo "npm test失败,终止提交"
    exit 1
fi

写法2:简洁的短路判断

#!/bin/sh

commitMessage=$(cat $1)

pattern="TMP|\[FIX-A[0-9]+\]\s[A-Z]+\s:\s.+|\[FIX-D[0-9]+-P[0-9]+\]\s[A-Z]+\s:\s.+|\[NEW\]\s[A-Z]+\s:\s.+|\[REF\]\s[A-Z]+\s:\s.+|\[DOC\]\s.+|\[UPD\]\s[A-Z]+\s:\s.+|\[GIT\]\s.+|\[DEL\]\s.+"

if [[ ! "$commitMessage" =~ $pattern ]]; then
    echo "Commit message invalid => $commitMessage"
    exit 1
fi

# 若npm test失败则直接退出脚本,拦截提交
npm test || exit 1

这样修改后,当npm test执行失败时,脚本会以非0状态码退出,Git就会拦截本次提交操作。

内容的提问来源于stack exchange,提问作者tonymx227

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 16:15:31