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

如何在husky触发的shell脚本中判断git push是否携带--tags参数

git pre-push 拦截标签推送解决方案

git 原生的 pre-push 钩子不会直接暴露用户执行的完整 git push 命令,但你可以通过两种方式实现你的需求:

方案1(推荐通用):通过推送引用判断

pre-push 钩子的标准输入会传入本次所有待推送的引用信息,只要判断是否包含标签类引用即可,覆盖所有标签推送场景(包括 --tags 批量推送、单独推送单个标签),兼容性更强。

你的 stopTagPush.sh 可以写为:

#!/bin/sh

# 逐行读取待推送的引用信息
while read local_ref local_sha remote_ref remote_sha
do
  # 匹配标签类引用
  if echo "$remote_ref" | grep -q '^refs/tags/'
  then
    echo "❌ 禁止直接推送标签,标签需通过正式发布流程生成"
    exit 1
  fi
done

exit 0

配置注意事项:

  • 给脚本添加执行权限:chmod +x stopTagPush.sh,否则 husky 调用会失败
  • 该方案兼容 Windows、macOS、Linux 全平台,也适配 GUI 类 Git 工具触发的推送操作

方案2(仅作参考):读取父进程命令判断

如果你确实需要精准判断用户是否携带了 --tags 参数,可以通过读取 Git 进程的命令行参数实现,仅兼容类 Unix 环境:

#!/bin/sh

# 获取父进程(即 git push 进程)的完整命令
push_command=$(ps -ocommand= $PPID)

if echo "$push_command" | grep -q ' --tags\b'
then
  echo "❌ 禁止使用 --tags 选项批量推送标签"
  exit 1
fi

exit 0

该方案局限性:Windows 环境不兼容,若用户通过第三方 Git 工具、脚本间接触发推送,可能无法正确获取到命令参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 03:06:03