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

