补丁投递是什么
生产环境改少量配置或代码时,直接编辑文件难以留下变更记录,也容易漏掉某个节点。用 diff 生成统一格式补丁、scp 上传、--dry-run 演练、再统一应用,是一条可复核、可回滚的投递路径,适合小范围精确变更。
基本信息
| 场景 | 向生产环境投递小改动(配置、少量代码) |
|---|---|
| 工具链 | diff -u 生成补丁、scp 传输、patch 应用与回滚 |
| 关键选项 | -p 路径层级、-F0 精确匹配、-b 备份、-R 反向应用 |
| 前提 | 目标文件版本与生成补丁时保持一致 |
典型使用场景
- 配置微调:只改几行时比整文件覆盖更安全,评审时差异一目了然
- 多节点同步:同一份补丁在多台机器上按相同顺序应用,避免手工操作不一致
- 紧急修复:线上文件与仓库版本有差异时,用补丁把最小改动打上去
- 变更留痕:补丁文件可以归档,事后能还原当时改了什么
- 演练验证:先 --dry-run 确认能干净应用,再真正落地
步骤逐条执行
步骤逐条执行
diff -u app.conf app.conf.new > /tmp/app.conf.patch # 本地生成统一格式补丁
scp /tmp/app.conf.patch prod:/tmp/
ssh prod 'cd /etc/app && cp app.conf app.conf.bak' # 先留备份
ssh prod 'cd /etc/app && patch -p1 --dry-run < /tmp/app.conf.patch'
ssh prod 'cd /etc/app && patch -p1 -b < /tmp/app.conf.patch'
ssh prod 'grep -n CHANGED /etc/app/app.conf' # 复核改动已生效回滚
回滚
ssh prod 'cd /etc/app && patch -R -p1 < /tmp/app.conf.patch' # 反向应用
ssh prod 'cd /etc/app && cp app.conf.bak app.conf' # 或直接恢复备份
ssh prod 'diff -u /etc/app/app.conf.bak /etc/app/app.conf' # 确认已回到原状关键选项
| 选项 | 作用 | 适用情况 |
|---|---|---|
| -p1 与 -p0 | 去掉路径前缀层数 | 带 a/ b/ 前缀用 -p1,无前缀用 -p0 |
| --dry-run | 只检查不修改 | 上线前必做 |
| -b | 应用前备份原文件 | 默认备份为 .orig |
| -F0 | 禁止模糊匹配 | 关键文件避免错位打到相似代码 |
| -R | 反向应用即回滚 | 用同一份补丁撤销改动 |
补丁头里的 a/ 与 b/ 是 diff -u 的默认前缀,应用时用 -p1 去掉一层;本地生成的无前缀补丁用 -p0。
patch 默认允许少量上下文的模糊匹配,关键文件加 -F0 强制精确匹配,避免错位修改到相似代码。
应用前必须备份,--dry-run 不通过就不要继续,先核对 -p 层级与目标文件版本。