引言
????????在 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)