linux patch解析

Patch 解析

前言:

記錄一下我在工作中對patch操作積累的相關知識,因爲此方面的內容在網絡上記錄得比較片面與零散,特此記錄總結一下以方便學習使用patch。

基本命令介紹:

  1. 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

  1. 其他指令

加載所有補丁以及生成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行

-:代表本行文本在升級時應當在新文件中刪除

+:代表本行文本在升級時應當在新文件中增加

  • 參考資料以及鏈接
  1. https://www.cnblogs.com/wuyuxin/p/7001320.html
  2. quilt.pdf (/usr/share/doc/quilt/quilt.pdf)
  3. https://linuxacademy.com/blog/linux/introduction-using-diff-and-patch/

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章