纯 bash 脚本可实现 git 部署差异统计与巡检报告:一、用 git merge-base 或 rev-list 确定提交范围;二、git diff --name-status 提取变更文件,-u0 + grep 统计增删行并跳过二进制;三、匹配 sql/配置/敏感关键词识别风险;四、生成含环境、范围、文件列表、风险详情及验证建议的 markdown 报告。

在 Linux 中用 Shell 脚本实现部署前的代码变更差异统计并生成自动巡检报告,核心是:抓取 Git 提交范围内的变更文件、分析修改行数(增/删)、识别高风险操作(如 SQL、配置、敏感关键词),再汇总成可读报告。不依赖外部语言,纯 Bash + Git + 标准工具就能落地。
一、明确对比范围:获取本次部署涉及的提交区间
部署前通常已知「上一个发布版本 tag」和「当前待发布 commit」(或分支最新 HEAD)。脚本需自动推导出变更范围:
- 用 git merge-base 找两个分支最近共同祖先,比硬写 tag 更健壮(尤其存在多分支并行开发时)
- 若使用 tag,可用 git rev-list --count $OLD_TAG..$NEW_COMMIT 快速验证提交数量
- 避免直接用 git diff --name-only 不带参数——它默认对比工作区,不是实际要发布的变更
二、提取变更文件与行级统计
聚焦真实改动,过滤掉无关内容(如 .gitignore、日志、构建产物):
- 用 git diff --name-status $OLD..$NEW 获取文件增删改状态(A/M/D/R100 等)
- 对每个 M/A 文件,执行 git diff -U0 $OLD..$NEW -- $file | grep -E '^\+(?!\+\+)|^-[^-]' | wc -l 分别统计新增/删除行数(-U0 省略无关上下文,提高速度)
- 跳过二进制文件:git diff --no-ext-diff --quiet --exit-code $OLD..$NEW -- $file || continue
三、识别高风险变更模式
自动标记可能引发故障的修改点,提升巡检效率:
- SQL 变更:匹配 .sql、.ddl 文件,或代码中含 INSERT/UPDATE/ALTER TABLE/DROP(注意大小写和空格边界)
- 配置变更:扫描 application.yml/.properties、nginx.conf、Dockerfile,检查是否修改了端口、数据库地址、超时参数等关键字段
- 敏感操作:在 diff 内容中搜索 rm -rf、chmod 777、eval(、os.system(、process.exec( 等字符串(用 git diff -U0 输出后管道 grep)
四、生成简洁可读的巡检报告
输出为纯文本或 Markdown,便于邮件/IM/CI 日志查看:
- 头部包含:部署环境、时间、变更范围($OLD → $NEW)、总文件数、总增删行数
- 表格化列出变更文件,每行含:状态、路径、+/- 行数、风险标签(如「[SQL]」「[CONFIG]」)
- 单独 section 列出所有命中高风险模式的行(带文件名和上下文前缀,如 ⚠️ application.yml: 修改 spring.redis.timeout 从 2000 → 5000)
- 结尾加一行建议:请重点验证:SQL 脚本执行顺序、Nginx 路由规则兼容性、Redis 超时调整影响











