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

使用Husky限制分支推送的两类问题及目标分支获取咨询

Husky推送分支限制脚本修复方案

原脚本问题分析

  1. $1参数误解:pre-push钩子的第一个参数$1是远程仓库名称(比如origin),并非推送目标分支,原脚本用它判断分支匹配必然出错。
  2. 保护分支拦截逻辑缺失:原脚本仅拦截当前分支是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 06:22:19