引言
在 Linux 和开源世界中,patch
是一个极其强大且常用的工具。它允许开发者和系统管理员以增量方式修改文件,特别适用于源代码的更新、错误修复、功能补丁的分发与应用。
目录
引言
一、patch介绍
二、生成补丁文件
三、补丁文件内容解析
四、patch:应用补丁
1、基本语法
2、常见用法
五、常见应用场景
六、总结
参考资料
一、patch介绍
patch
是一个命令行工具,用于将一个“补丁”(patch)文件应用到目标文件或目录上,从而实现对文件内容的修改。补丁文件通常由 diff
命令生成,记录了两个文件之间的差异。
二、生成补丁文件
在使用 patch
之前,通常需要先用 diff
生成补丁文件。
最常用的是 统一格式(unified format),使用 -u
选项:
diff -u original.txt modified.txt > changes.patch
三、补丁文件内容解析
--- original.txt 2025-08-07 10:00:00.000000000 +0800
+++ modified.txt 2025-08-07 10:05:00.000000000 +0800
@@ -1,5 +1,6 @@This is the original file.It has several lines.
-Line to be removed.
+This line is added.A line in the middle.Another line.
+New line at the end.
---
:原始文件+++
:修改后的文件@@ -1,5 +1,6 @@
:表示从原始文件第1行开始的5行,变为修改后文件第1行开始的6行。-
开头的行:表示删除+
开头的行:表示添加
四、patch
:应用补丁
1、基本语法
patch [选项] [目标文件] <补丁文件>
-p<num> | 从补丁文件中的文件路径名中剥离 如: |
-b | 备份每个被修改文件的原始内容。备份文件名通常是原文件名加 ~ 后缀 |
-s | 静默模式,不输出错误信息 |
-f | 强制应用,忽略有错误前置条件的补丁,并假设补丁不是反向的 |
-N | 忽略已应用的补丁忽略已反向的或已应用过的补丁,防止重复应用或错误地反向应用 |
-r <file> | 将无法成功应用的补丁片段(拒绝的 hunks)输出到指定的 FILE 文件中,指定拒绝文件名(默认为 .rej ) |
--dry-run | 模拟运行,不实际修改任何文件,只打印出将会发生什么。 |
-o <file> | 将打完补丁后的文件输出到指定的 FILE |
--merge | 使用冲突标记(<<<<<<< , ======= , >>>>>>> ),而不是创建拒绝文件 |
--help : | 输出帮助信息 |
2、常见用法
-
应用单个文件补丁
patch original.txt < changes.patch
-
剥离前导目录安装补丁(常用在源码目录)
cd /path/to/source
patch -p1 < ../changes.patch
其中,-p1
:表示去掉补丁文件中文件路径的第一层目录。例如,补丁中路径为
a/src/main.c
,使用-p1
后会查找src/main.c
。
- 安装当前路径下的所有patch文件(需统一补丁文件后缀,如“.patch”)
for patch in *.patch; dopatch -p1 < "$patch"
done
-
备份原文件
patch -b original.txt < changes.patch
-
指定工作目录
patch -d /path/to/dir < changes.patch
-
反向打补丁(回退到合并该补丁前)
patch -R < changes.patch
- 模拟运行合并补丁
patch --dry-run original.txt < changes.patch
五、常见应用场景
-
开源项目贡献
开发者修改源码后,使用 diff
生成补丁,提交给项目维护者审核。
-
内核或软件热修复
在不重新编译整个系统的情况下,通过打补丁快速修复安全漏洞。
-
自动化构建与持续集成
CI/CD 流程中,自动应用配置补丁或代码修复。
-
版本控制辅助
虽然 Git 等工具已内置 diff/patch 功能,但在某些场景下仍需手动处理补丁。如
#生成标准差异补丁
git diff > my-changes.patch#为单个提交生成补丁
git format-patch -1 <commit-hash>#为最近 N 个提交生成补丁
git format-patch -3#为从某个提交之后的所有提交生成补丁
#如生成所有在当前分支但不在 main 分支上的提交的补丁文件
git format-patch main
六、总结
patch
是 Linux 系统中不可或缺的工具之一,尤其在开源协作、系统维护和自动化部署中发挥着重要作用。掌握 diff
和 patch
的使用,不仅能提升工作效率,还能深入理解文件变更的本质。
参考资料
- man diff
man P
atch- GNU Patch Manual
- Linux Documentation Project (tldp.org)