编写 Git Hook 自动化预防脏数据提交

发布时间:2026/9/19 7:27:35
编写 Git Hook 自动化预防脏数据提交 编写 Git Hook 自动化预防脏数据提交在团队协作或开源项目中代码库里经常会不小心混入一些“脏数据”误把本地包含真实 API Key 或密码的.env文件提交了上去误把几十兆的临时构建产物、测试视频或.tar.gz压缩包合进了 Git 历史提交了没有经过自动格式化的杂乱代码引发无意义的 Code Review 格式拉扯。一旦大文件或敏感密钥被提交并推送到了远程仓库即使后续提交把它删除了它依然会永久残留在 Git 历史对象中必须通过危险的filter-branch或bfg才能彻底剥离。用纯 Shell 编写一个轻量级的pre-commit钩子不到 30 行脚本就能在本地提交的瞬间完成拦截。为什么不依赖庞大的 husky 套件很多前端项目习惯安装huskylint-staged。这两个包不仅带来了上百个子依赖还经常因为 Node.js 版本和脚本权限问题在 Windows 与 Linux 之间报执行错误。Git 自 2.9 版本起原生就支持通过一条命令自定义钩子目录# 优雅地将 git hooks 路径指向项目内的 .githooks 目录零外部依赖 git config core.hooksPath .githooks30 行核心 pre-commit 拦截脚本在项目根目录下创建.githooks/pre-commit并赋予执行权限chmod x .githooks/pre-commit#!/bin/bash set -e echo [Pre-Commit] 正在执行本地提交安全检查... # 1. 检查是否存在暂存的大体积文件超过 1MB 强制拦截 MAX_FILE_SIZE1048576 # 1MB LARGE_FILES$(git diff --cached --name-only | while read file; do if [ -f $file ]; then size$(wc -c $file) if [ $size -gt $MAX_FILE_SIZE ]; then echo ❌ 错误: 文件 $file 体积为 $((size / 1024))KB超过了 1MB 上限禁止提交至代码库。 fi fi done) if [ -n $LARGE_FILES ]; then echo $LARGE_FILES exit 1 fi # 2. 检查是否误暂存了敏感配置文件 SENSITIVE_FILES$(git diff --cached --name-only | grep -E ^\.env$|\.pem$|\.key$|id_rsa || true) if [ -n $SENSITIVE_FILES ]; then echo ❌ 严重安全拦截: 发现敏感密钥文件已被暂存: echo $SENSITIVE_FILES echo 请将其从 Git 暂存区移除并加入 .gitignore exit 1 fi # 3. 运行极速代码格式化校验以 Biome 为例耗时 100ms if command -v pnpm /dev/null; then pnpm biome check --staged --error-on-warnings || { echo ❌ 代码规范检查未通过请先修复格式警告后再次提交 exit 1 } fi echo ✅ [Pre-Commit] 检查通过允许提交团队一键自动化初始化为了让新加入的同学拉取代码后自动启用该钩子只需在package.json的scripts中配置prepare钩子{ scripts: { prepare: git config core.hooksPath .githooks || true } }每次执行pnpm install时Git 钩子路径就会被自动配置就绪完全不需要任何多余的操作。总结最好的防守是把问题消灭在萌芽状态。用极简的原生 Git 机制守护代码库的纯净用最小的工程代价换取长久的安心。