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
相关产品推荐
相关产品推荐

