pre-commit钩子修改文件时的提交消息问题求解
解决方案
你遇到的核心问题是:pre-commit钩子运行时,用户的提交流程还没完成(如果用编辑器输入消息,此时消息还没输入),直接用git commit --no-verify -m会覆盖原提交逻辑;同时需要避免钩子递归触发。
以下是修改后的原生shell脚本,完美解决自定义提交消息+自动处理格式化后的提交需求:
# 检测是否是black格式化后的二次提交,避免递归 if [ -f .git/black_recommit_flag ]; then rm .git/black_recommit_flag # 跳过格式化步骤,直接通过钩子检查 exit 0 fi # 运行flake8和mypy检查 flake8 ./src FLAKE8_EXIT_CODE=$? mypy ./src MYPY_EXIT_CODE=$? # 检查未通过则终止提交 if [ $FLAKE8_EXIT_CODE -ne 0 ] || [ $MYPY_EXIT_CODE -ne 0 ]; then echo "flake8 or mypy checks failed. Skipping black and commit." exit 1 fi # 执行black格式化并更新暂存区 black . git add -u # 检查是否有文件被black修改 if ! git diff-index --quiet HEAD; then # 创建临时标记文件,标记这是格式化后的二次提交 touch .git/black_recommit_flag echo "Black formatted modified files. Re-running commit with your original message..." # 重新执行用户最初的git commit命令,保留所有参数(包括提交消息) exec git commit "$@" fi # 无文件修改,正常继续原提交流程 exit 0
关键逻辑说明:
- 临时标记文件:
.git/black_recommit_flag用来识别是否是格式化后的二次提交,第二次运行钩子时会删除标记并直接通过,彻底避免递归。 exec git commit "$@":完全复用用户最初执行的git commit命令参数(比如-m "自定义消息"或者编辑器输入流程),完美保留用户的提交消息,不会固定内容。- 流程顺序:先做代码检查,通过后再格式化,有修改则重新触发提交,无修改则正常走原流程。
内容的提问来源于stack exchange,提问作者Barzi2001
相关产品推荐
相关产品推荐

