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

