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

