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

如何推送husky pre-push钩子生成的自动版本更新提交?

解决husky pre-push钩子自动版本提交需二次推送的问题

问题根源

pre-push钩子触发时,Git已经锁定了要推送的提交范围(基于当前执行push时的HEAD)。如果在钩子里生成新的版本提交,新HEAD会比原推送的HEAD多一个节点,原push操作不会包含这个新提交,所以得手动再推一次;而第二次push又会触发钩子,陷入循环。

可行解决方案

1. 钩子内完成提交后,手动推送并终止原流程

直接在pre-push钩子脚本里,做完版本更新和提交后,手动推送新的HEAD,然后终止原有的push操作,同时添加判断避免循环触发。

2. 完整脚本示例

#!/usr/bin/env bash

# 检查最后一次提交是否是自动版本提交,是则直接放行,避免循环
LAST_COMMIT_MSG=$(git log -1 --pretty=%B)
if [[ "$LAST_COMMIT_MSG" == "AutoBump Version" ]]; then
  exit 0
fi

# 这里替换成你的版本选择逻辑,比如询问用户版本类型
read -p "选择版本更新类型(patch/minor/major): " BUMP_TYPE
npm version $BUMP_TYPE --no-git-tag-version

# 提交版本变更
git add package.json package-lock.json
git commit -m "AutoBump Version"

# 手动推送新HEAD到目标分支,$1是pre-push传入的目标分支(如refs/heads/main)
git push origin HEAD:$1

# 终止原push流程,因为原push基于旧HEAD,已经不需要执行了
exit 1

关键逻辑说明

  • 防循环判断:通过检查最后一次提交的消息,确认是自动版本提交时直接退出钩子,避免第二次push重复执行版本更新。
  • 指定推送目标:git push origin HEAD:$1 中的$1是pre-push钩子默认接收的第一个参数,即用户要推送的目标分支引用,确保新提交推送到正确分支。
  • 终止原流程:用exit 1结束钩子,让Git放弃原来的push操作(因为我们已经手动推了新的HEAD)。

备选思路(不推荐)

如果不想在pre-push里直接处理推送,可以用临时文件标记需要更新版本,配合post-commit钩子完成推送,但这种方式需要额外的状态管理,不如上面的方案直接高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 16:04:53