commit-msg钩子报‘[[: not found’错误,排查问题原因
Git Commit Hook 报错
[[: not found]] 的原因与解决方法 你的问题出在脚本解释器和语法不兼容:
- 脚本开头指定的是
#!/bin/sh,但[[ ... ]]以及=~正则匹配是Bash专属的扩展语法。 - 多数Linux发行版中,
/bin/sh是轻量级Shell(比如Debian/Ubuntu用dash),不支持这些Bash独有的语法,所以执行时会找不到[[命令,抛出错误。
两种解决办法
方法1:改用Bash解释器
直接把脚本第一行的#!/bin/sh改成#!/bin/bash,这样脚本会用Bash执行,原有语法可以正常工作:
#!/bin/bash COMMIT_MSG_FILE=$1 comm_msg=$(head -1 $COMMIT_MSG_FILE) # 注意:原脚本里的`head -l`是笔误,应该是`head -1`取第一行 if [[ $comm_msg =~ ^TASKID-[\d]+ ]]; then exit 0 else echo "Commit message must start with task id." >&2 exit 1 fi
方法2:改用POSIX Shell兼容语法
如果要保持用/bin/sh执行,需要把判断逻辑改成POSIX标准支持的写法,用expr工具做正则匹配:
#!/bin/sh COMMIT_MSG_FILE=$1 comm_msg=$(head -1 $COMMIT_MSG_FILE) if expr "$comm_msg" : "^TASKID-[0-9]\+" > /dev/null; then exit 0 else echo "Commit message must start with task id." >&2 exit 1 fi
另外提醒:原脚本里的head -l是拼写错误,应该是head -1(小写L是参数错误,数字1才是取第一行),这个问题也需要修正,否则脚本可能无法正确读取提交信息。
内容的提问来源于stack exchange,提问作者Thundercleez
相关产品推荐
相关产品推荐

