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

Git pre-push钩子执行交互式脚本失败:出现"do" unexpected语法错误

Git pre-push钩子执行时报Syntax error: "do" unexpected,手动运行正常

我编写了一个交互式Git pre-push钩子,用于在推送代码前升级npm包版本,脚本内容如下:

#!/bin/bash

current_branch=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')

echo "Pushing ${current_branch}"

current_version=$(npm run version -s)

echo "Current version: $current_version"

patch_version=$(npx semver $current_version -i patch)
minor_version=$(npx semver $current_version -i minor)
major_version=$(npx semver $current_version -i major)

# Choose the version bump type
PS3="Select the version bump type: "
select bump_type in "patch - Bump into ${patch_version}" "minor - Bump into ${minor_version}" "major - Bump into ${major_version}" "none - Keep Same"; do

  case $bump_type in
    "patch"*)
      # Increment version based on the chosen bump type
      new_version="patch"
      break
      ;;
    "minor"*)
        new_version="minor"
        break
        ;;
    "major"*)
        new_version="major"
        break
        ;;
    "none"*)
      echo "No version selected, skipping bump."
      exit 0
      ;;
    *)
      echo "Invalid selection, please choose a valid option."
      ;;
  esac
done

echo "Bumping version to $new_version"

# Update package.json with the new version
new_version=$(npm version ${new_version} --force --silent)

echo "Version bumped to $new_version"

echo "Keep package-lock.json up to spec"
npm install
git commit -m "AutoBump Version" package.json package-lock.json

但执行git push推送分支时,出现如下报错:

Pushing dev
Current version: 1.0.3
.husky/pre-push: 17: Syntax error: "do" unexpected
husky - pre-push script failed (code 2)
error: απέτυχε η δημοσίευση κάποιων ref στο 'github.com:ellakcy/fa-checkbox.git'

手动运行脚本却能正常工作:

bash .husky/pre-push 
Pushing dev
Current version: 1.0.3
1) patch - Bump into 1.0.4
2) minor - Bump into 1.1.0
3) major - Bump into 2.0.0
4) none - Keep Same
Select the version bump type: 

试过相关解决方案但未解决,求处理办法。


问题根源

报错核心原因是husky默认用sh而非bash执行钩子脚本,而脚本中使用的select...do是Bash专属语法,POSIX标准的sh不支持该特性,因此执行时触发语法错误。

解决方法

方法1:强制husky用Bash运行钩子

确保脚本以Bash执行:

  • 确认脚本开头的#!/bin/bash未被修改,且文件拥有可执行权限(执行chmod +x .husky/pre-push)
  • 或在项目根目录的.huskyrc/.huskyrc.js中指定shell:
    {
      "shell": "/bin/bash"
    }
    

方法2:替换select为兼容sh的交互逻辑

若不想依赖Bash,可改用read命令实现选择功能,替换原select代码块:

#!/bin/sh

# ... 保留前面的代码 ...

# 替换select部分为兼容sh的交互逻辑
echo "Select the version bump type:"
echo "1) patch - Bump into ${patch_version}"
echo "2) minor - Bump into ${minor_version}"
echo "3) major - Bump into ${major_version}"
echo "4) none - Keep Same"
echo -n "Enter your choice: "
read choice

case $choice in
  1)
    new_version="patch"
    ;;
  2)
    new_version="minor"
    ;;
  3)
    new_version="major"
    ;;
  4)
    echo "No version selected, skipping bump."
    exit 0
    ;;
  *)
    echo "Invalid selection, please choose a valid option."
    exit 1
    ;;
esac

# ... 保留后面的代码 ...

验证

修改后再次执行git push,即可正常触发交互式版本选择,不会再出现语法错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 03:23:34