必须将pre-commit脚本置于.git/hooks/pre-commit路径、赋予可执行权限、使用#!/bin/sh开头并用绝对路径调用工具;推荐用pre-commit框架自动管理,执行pre-commit install启用。
在 macos 上为 git 配置提交前自动运行代码检查的钩子(hook),核心是设置 pre-commit 脚本,并确保它可执行、位置正确、逻辑可靠。git 钩子本身不依赖系统平台,但 macos 的文件权限、shell 环境(如 zsh 默认)、路径和工具安装方式会影响实际效果。
把 pre-commit 脚本放进 .git/hooks/ 目录
Git 本地钩子脚本必须放在仓库根目录下的 .git/hooks/ 里。这个目录默认已存在,里面包含一些示例文件(如 pre-commit.sample)。
- 进入你的项目根目录,执行:
cd /path/to/your/repo - 创建或编辑钩子文件:
touch .git/hooks/pre-commit - 用你喜欢的编辑器(如 nano 或 VS Code)写入脚本内容,例如:
#!/bin/sh
echo "Running code checks before commit..."
npm run lint 2>/dev/null || { echo "❌ Lint failed — aborting commit"; exit 1; }
echo "✅ All checks passed"
注意:第一行 #!/bin/sh 必须存在,且不能有多余空格或 BOM;macOS 默认 Shell 是 zsh,但 Git 钩子统一使用 /bin/sh 执行,所以避免用 zsh 特有语法(如 [[ ]] 建议换成 [ ])。
给脚本加上可执行权限
macOS 使用 Unix 权限模型,Git 不会自动执行没有 x 权限的钩子文件。
- 运行命令赋予执行权:
chmod +x .git/hooks/pre-commit - 验证是否生效:
ls -l .git/hooks/pre-commit—— 输出中应看到-rwxr-xr-x这类含x的权限位 - 如果提示 “Permission denied”,通常就是这一步遗漏了
确保检查命令在钩子环境中可用
Git 钩子运行时的 $PATH 很精简(通常不含 ~/bin 或 Node/npm 的用户路径),容易出现 command not found。
- 推荐用绝对路径调用关键命令,比如:
/opt/homebrew/bin/node(Apple Silicon Homebrew)、/usr/local/bin/npm或$(which npm) - 也可以在脚本开头显式扩展 PATH:
export PATH="/opt/homebrew/bin:/usr/local/bin:$PATH" - 如果是 Python 工具(如 black、flake8),确认 virtualenv 是否激活——钩子不会继承终端的激活环境,建议用全局安装或指定解释器路径(如
/opt/homebrew/bin/python3)
用 pre-commit 框架更省心(推荐)
手动维护 .git/hooks/pre-commit 容易出错、难同步、不跨平台。macOS 上更推荐用社区成熟的 pre-commit 框架,它自动管理钩子、隔离环境、支持共享配置。
- 安装:
pip3 install pre-commit或brew install pre-commit - 在项目根目录新建
.pre-commit-config.yaml,例如:
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.6.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- repo: https://github.com/psf/black
rev: 24.4.2
hooks:
- id: black
- 启用钩子:
pre-commit install(会在.git/hooks/pre-commit自动生成托管脚本) - 首次运行检查:
pre-commit run --all-files - 后续每次
git commit都会自动触发配置好的检查
这个方式天然适配 macOS,还能轻松和团队共享一致的检查规则,避免手动脚本散落各处。











