使用Husky限制分支推送的两类问题及目标分支获取咨询
Husky推送分支限制脚本修复方案
原脚本问题分析
- $1参数误解:pre-push钩子的第一个参数
$1是远程仓库名称(比如origin),并非推送目标分支,原脚本用它判断分支匹配必然出错。 - 保护分支拦截逻辑缺失:原脚本仅拦截当前分支是
master/develop时的推送,未限制从其他分支向保护分支推送的操作。
正确获取推送目标分支的方法
Git的pre-push钩子会通过标准输入传递推送的分支映射信息,格式为:
<本地分支引用> <本地提交SHA> <远程分支引用> <远程提交SHA>
我们可以通过解析这行内容提取远程目标分支名,比如用sed截取远程分支部分,去掉refs/heads/前缀得到真实分支名。
修复后的完整脚本
. "$(dirname -- "$0")/_/husky.sh" # 获取当前本地分支名 LOCAL_BRANCH=$(git rev-parse --abbrev-ref HEAD) # 定义保护分支正则 PROTECTED_BRANCHES="^(master|develop)$" # 读取pre-push传递的推送信息,提取远程目标分支名 read -r LOCAL_REF LOCAL_SHA REMOTE_REF REMOTE_SHA REMOTE_BRANCH=$(echo "$REMOTE_REF" | sed 's/refs\/heads\///') # 限制:只能推送到与本地分支同名的远程分支 if [ "$REMOTE_BRANCH" != "$LOCAL_BRANCH" ]; then echo -e "\n❌ 只能推送到与本地分支同名的远程分支:$LOCAL_BRANCH" exit 1 fi # 限制:禁止向保护分支推送(无论当前分支是什么) if [[ "$REMOTE_BRANCH" =~ $PROTECTED_BRANCHES ]]; then echo -e "\n🚫 禁止向保护分支 $REMOTE_BRANCH 推送,请创建个人分支并通过PR提交。" exit 1 fi echo -e ">> 分支检查通过" exit 0
关键修复点说明
- 目标分支获取:通过
read读取标准输入的推送信息,再用sed处理远程分支引用,得到真实的目标分支名。 - 分支匹配逻辑:对比远程目标分支和本地分支名,确保只能推送到同名远程分支。
- 保护分支拦截:直接检查推送的目标分支是否属于保护分支,彻底拦截所有向
master/develop的推送操作。
内容的提问来源于stack exchange,提问作者Milan Poudel
相关产品推荐
相关产品推荐

