Patch 解析
前言:
記錄一下我在工作中對patch操作積累的相關知識,因爲此方面的內容在網絡上記錄得比較片面與零散,特此記錄總結一下以方便學習使用patch。
基本命令介紹:
- diff:
Diff命令爲系統自帶的文件比較命令,可以比較兩個文件或文件夾的差異、並將差異信
息按照用戶指定的方式輸出。
處理單個文件的比較:
diff -uN [old-file] [new-file] > [old-to-new.patch]
文件夾比較:
diff -uNr [old-dir] [new-dir] > [old-to-new.patch]
2.git diff:
此命令爲git工具集中patch生成的工具,可以比較git倉庫中兩個版本中改動的文件差異信息,且用法較之於diff命令更爲簡潔。
獲取當前工作區與當前分支最後一次提交的差異:
git diff
獲取兩次提交的差異信息:
git diff [old-commit-hash] [new-commit-hash]
3.patch:
patch命令爲應用patch的命令,可以根據patch文件對源文件進行升級(打補丁)或降級(去補丁)。
應用補丁(升級):
patch -p1 < [patch_name.patch]
撤銷補丁的應用(降級):
patch -RE < [patch_name.patch]
4.quilt:
quilt是一個大批量補丁集的操作工具,加載補丁後會在執行加載命令的目錄下生成.pc
目錄以用於quilt的操作的記錄以及已應用補丁的備份。
若執行quilt相關命令顯示“No series file found”,可以通過設置“QUILT_PATCHES”環境變量解決。
debian系linux發行版一般設置爲:
export QUILT_PATCHES=debian/patches
應用所有記錄在series的補丁:
quilt push -a
應用下一個記錄在series且未加載的補丁:
quilt push
應用series中某一個未加載的補丁:
quilt push [name.patch]
取消最後應用的那個補丁:
quilt pop
取消所有的補丁:
quilt pop -a
使用quilt新建某個補丁:
1).初始化新建補丁
quilt new [file_name.patch]
2).添加追蹤文件
quilt add [todo_file_a] [todo_file_b] [todo_file_c] ...
3).修改文件
此時可以使用patch指令修改或者手動修改
4).生成修改記錄到補丁
quilt refresh
- 其他指令
加載所有補丁以及生成dsc文件:
dpkg-source -b ./
使changelog的修改生效:
dpkg-source --commit
Patch簡單分析:
本示例採用兩個文件內容如下:
dest-info-fit-orig.list:
1 123456789
2 123456789
3 123456789
4 123456789
5 123456789
6 123456789
7 123456789
8 123456789
9 123456789
10 123456789
11
12
13
14
15
16
17
18
19
20
dest-info-fit-new.list:
1 123456789
2 changeigfo
3 123456789
4 123456789
5 123456789
6 123456789
8 123456789
9 123456789
10 123456789
11
12 add new info
13
14
addline
15
16
17
18
19
20
- diff常規格式補丁
由diff 命令不帶參數時生成,由以上兩個文件生成的patch內容如下:
生成該補丁的命令爲:
diff dest-info-fit-orig.list dest-info-fit-new.list
2c2
< 2 123456789
---
> 2 changeigfo
7d6
< 7 123456789
12c11
< 12
---
> 12 add new info
14a14
> addline
2c2:操作C(change),左側數字爲原始文件中需要被改變的行,右側數字爲修改後補丁中信息所應該存在的行。
符號<:表示原始文件信息
符號---:原始文件信息與待填充信息的分隔符
符號>:新信息提示符
7d6:操作D(delet),左側只能是一個數字,記錄原始文件應該刪除的行數7,右側數字6爲去除patch時應當在第6行後面插入該刪除信息,用於恢復原始文件。
14a14:操作A(append),左側數字14代表在第14行插入信息,右側數字14代表插入的信息在新文件中的第14行
- 上下文格式補丁
由diff命令使用C參數生成,具體操作命令如下:
diff -c dest-info-fit-orig.list dest-info-fit-new.list
*** dest-info-fit-orig.list 2020-06-23 13:26:36.268788853 +0800
--- dest-info-fit-new.list 2020-06-23 17:34:45.963815387 +0800
***************
*** 1,17 ****
1 123456789
! 2 123456789
3 123456789
4 123456789
5 123456789
6 123456789
- 7 123456789
8 123456789
9 123456789
10 123456789
11
! 12
13
14
15
16
17
--- 1,17 ----
1 123456789
! 2 changeigfo
3 123456789
4 123456789
5 123456789
6 123456789
8 123456789
9 123456789
10 123456789
11
! 12 add new info
13
14
+ addline
15
16
17
***:原始文件名提示符,後跟原始文件文件名以及最後修改時間
---:升級後文件名提示符,後跟新文件文件名以及最後修改時間
***************:大代碼塊提示符(15個*)
***1,17****:表示下方信息對應的原始文件的1-17行範圍
---1,17----:表示下方信息對應的新版本文件的1-17行範圍
!:標記此行有修改
+:標記此行有插入
-:標記此行有刪除
- 統一格式補丁
由diff命令使用u 參數生成,具體操作命令如下:
diff -u dest-info-fit-orig.list dest-info-fit-new.list
--- dest-info-fit-orig.list 2020-06-23 13:26:36.268788853 +0800
+++ dest-info-fit-new.list 2020-06-23 17:34:45.963815387 +0800
@@ -1,17 +1,17 @@
1 123456789
-2 123456789
+2 changeigfo
3 123456789
4 123456789
5 123456789
6 123456789
-7 123456789
8 123456789
9 123456789
10 123456789
11
-12
+12 add new info
13
14
+addline
15
16
17
---:原始文件路徑、文件名、最後修改時間
+++:原始文件路徑、文件名、最後修改時間
@@ -1,17 +1,17 @@: -1,17代表下面的文本信息對應原始文件的1-17行;+1,17代表下面文本信息對應新文件的1-17行
-:代表本行文本在升級時應當在新文件中刪除
+:代表本行文本在升級時應當在新文件中增加
- 參考資料以及鏈接
- https://www.cnblogs.com/wuyuxin/p/7001320.html
- quilt.pdf (/usr/share/doc/quilt/quilt.pdf)
- https://linuxacademy.com/blog/linux/introduction-using-diff-and-patch/