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

Husky pre-commit调用codegen后Git无法正确提交生成文件问题

问题核心原因
  • 错误在pre-commit hook中主动执行git commit并返回退出码1:pre-commit hook是Git在执行提交前触发的校验逻辑,你不需要在hook内部手动发起提交。手动执行git commit会触发嵌套的hook流程,最后返回exit 1会直接终止你原本发起的提交任务,导致流程卡在中间状态。
  • 操作顺序错误+暂存区与工作区内容不一致:你先执行了pretty-quick --staged格式化暂存区文件,之后才生成代码、执行内置的prettier格式化,两次格式化/生成操作的差异没有同步到暂存区,就会出现同一个文件同时出现在「待提交」和「未暂存」列表的情况。
修正方案

你只需要在检测到schema更新后,执行代码生成、把生成的文件加入暂存区,然后正常退出让原本的提交流程继续即可,修正后的脚本如下:

#!/bin/sh
. "$(dirname $0)/_/husky.sh"

# 先判断是否需要生成代码
if [ services/foo/gql/schema.graphql -nt services/foo/src/generated/graphql.ts ]; then
  echo "running generation in services/foo after updating .graphql file"
  yarn --cwd ./services/foo gen-ts
  # 把所有生成后的文件加入暂存区
  git add services/foo/src/generated/graphql.ts services/foo/src/generated/models.ts
fi

# 最后统一格式化所有暂存的文件(包含你刚add的生成文件)
yarn pretty-quick --staged
异常状态修复方法

你之前看到的git status异常是因为:hook内部提交的版本是生成后、还没被后续格式化修改的版本,返回exit 1终止原提交后,工作区的文件已经被gen-ts里的prettier修改,和暂存区的版本不一致,所以两边都显示有修改。你可以先执行git add services/foo/src/generated/graphql.ts把工作区的修改同步,或者直接git reset HEAD~回退hook里误提交的版本,再用修正后的脚本重新提交即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 07:06:02