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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 20:33:26