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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 04:28:12