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

