diff补丁格式
在Uboot学习中,接触到了打补丁这个操作,首先来学习下diff的patch文件格式.
命令参数
diff
常使用的 patch 参数:
- ”-u”:表示在比较结果中输出上下文中一些相同的行
- “-r“:表示递归比较各个子目录下的文件
- “-N“:将不存在的文件当作空文件
- “-w“:忽略空格的比较
- “-B“:忽略空行的比较
patch
常使用的 patch 参数:
- "-p": 指定目录级别(从路径全称中除去几层目录)如,如果补丁文件包含路径名称 /curds/whey/src/blurfl/blurfl.c 那么:-p0 使用完整路径名,-p1 除去前导斜杠,留下 curds/whey/src/blurfl/blurfl.c,-p4 除去前导斜杠和前三个目录,留下blurfl/blurfl.c
- "-d" :Directory 打补丁前,更改当前目录到指定目录
- "-i" :PatchFile 指定补丁文件,而不是从标准输入中读取补丁信息
- "-R" :逆向补丁,这个选项在防止打错补丁很有用处
制作补丁
使用命令 diff -urN oldFloder NewFloder > mypatch.diff
, 其中oldFloder
为原旧文件,NewFloder
为新文件,生成补丁mypatch.diff
应用补丁
使用命令 patch -p1 < ../test.diff
来应用补丁
卸载补丁
使用命令 patch -p1 -R < ../test.diff
补丁文件内容
- 第一行,首先指定文件目录路径个比对参数
- 第二行,
---.....
表示原来的文件 - 第三行,
+++....
表示新文件 - 第四行一般是被
@@...@@
包含的内容,比如@@ -206,8 +206,8 @@
: -206表示原来的第206行,8表示总共8行,+206表示这是从新文件的206行,总共也有8行 - 文件内容中
-
表示删除这一行,+
表示新增这一行,无+-
表示保持原来的
例子
- 1. 在OldFloder存在文件test.txt
111111
222222
333333
444444
555555
- 2. 在NewFloder存在文件test.txt
111111 add here
delete 222222 here
33 change 33
444444
555555
- 3. 为OldFloder创建补丁
diff -urN OldFloder NewFloder > test.diff
- 4. 查看下补丁的内容
cat test.diff
diff -urN OldFloder/test.txt NewFloder/test.txt
--- OldFloder/test.txt 2018-09-20 21:15:40.576162357 +0800
+++ NewFloder/test.txt 2018-09-20 21:17:02.747161577 +0800
@@ -1,5 +1,5 @@
-111111
-222222
-333333
+111111 add here
+delete 222222 here
+33 change 33
444444
555555
- 5. 应用补丁,
patch -p1 < ../test.diff
,命令前面的-p1
表示忽略路径中第1个父目录,我们这里是在OldFloder
中应用的,所以是p
- 6. 查看在
OldFloder
中的文件cat test.txt
,可以发现已经应用成功
111111 add here
delete 222222 here
33 change 33
444444
555555
- 7. 例子解析
diff -urN OldFloder/test.txt NewFloder/test.txt
--- OldFloder/test.txt 2018-09-20 21:15:40.576162357 +0800
+++ NewFloder/test.txt 2018-09-20 21:17:02.747161577 +0800
@@ -1,5 +1,5 @@
-111111
-222222
-333333
+111111 add here
+delete 222222 here
+33 change 33
444444
555555
@@ -1,5 +1,5 @@
表示原来文件的第1行开始,总共有5行,新文件从第1行开始,总共有5行-111111
表示删除原文件这一行-222222
表示删除原文这一行-333333
表示删除原文这一行- 后面三个
+++....
表示新增这一行 - 接下去的
444444
和55555
表示不更改 - 这么减了三行,去除三行,然后再保留原来的两行
444444
和555555
,总共还是5行