linux笔记 diff及patch的制作与使用

简介: 这篇文章是关于Linux系统中使用`diff`命令生成补丁文件以及使用`patch`命令应用这些补丁的详细教程和实战案例。

相关命令展示

为方便查阅博客使用,预先展示相关命令

diff命令

diff -uN old.txt new.txt > patch_test.patch

单个文件,不需要使用-r参数

diff 选项参数 旧文件(夹) 新文件(夹) > 补丁

diff命令的常用选项参数

-r
递归recursion 将新旧版本代码所在目录所有文件递归比较,包括子目录

-N
确保补丁正确无误地处理已创建或删除文件的情况
-u
默认为输出每个需要修改的代码块的前后3行,如需指定行数,则使用-uNUM,更改NUM为所需行数

patch命令

旧文件目录

patch -p0 < patch_test.patch

注意!patch必须在旧文件夹中打,否则将会发生错误!

patch命令的格式

patch将diff生成的补丁记录下的差异信息,应用到旧文件上

patch 选项参数 < 补丁 #    patch中已含有新旧文件的信息,无须将新旧文件作为参数输入

patch的常用选项参数

-pNUM
NUM表示忽略的文件夹层数,忽略patch文件中新旧文件的父目录层数
以desktop/diff_patch_test/old为例
-p0为在desktop目录下找diff_patch_test再找old
-p1则是忽略第一层的desktop目录,直接从当前目录下找diff_patch_test再找old
(存疑)
-E
empty 如果发现空文件,则删除,常见于需要删除旧文件夹中某个旧文件整体的情况,以及恢复补丁时删除之前新写的无效文件
-R
reverse 取消打的补丁

通过patch恢复源文件

当补丁错误时,可以使用-RE选项参数恢复源文件,意为取消打的补丁,并删除空文件

patch -RE -p0 <patch_test.patch

案例1:单个文件的补丁制作与替换

以单个文件为例,diff与patch制作及打补丁呈现过程

1.源文件(旧)

old.txt

11111111
22222222
33333333
44444444
aaaaaaaa
bbbbbbbb
cccccccc
dddddddd

2.目的文件(新)

new.txt

11111111
55555555
66666666
77777777
aaaaaaaa
eeeeeeee
ffffffff
gggggggg

3.通过diff命令制作patch文件

在该文件目录下

diff -uN old.txt new.txt > patch_test.patch

因此处为单个文件,不需要使用-r参数

diff命令的格式

diff 选项参数 旧文件(夹) 新文件(夹) > 补丁

diff命令的常用选项参数

-r
递归recursion 将新旧版本代码所在目录所有文件递归比较,包括子目录

-N
确保补丁正确无误地处理已创建或删除文件的情况
-u
默认为输出每个需要修改的代码块的前后3行,如需指定行数,则使用-uNUM,更改NUM为所需行数

4.查看patch文件的组成

在这里插入图片描述

--- old.txt    2023-02-09 10:17:20.787930669 +0800    #    补丁头 ---开头表示旧文件
+++ new.txt    2023-02-09 10:18:54.989109075 +0800    #    补丁头 +++开头表示新文件
@@ -1,8 +1,8 @@    #    @@开头表示块位置 是文件需要修改前后的定位行及段落区间等信息,以@@结束
                #    -1,8表示需要修改的代码块在旧文件的行号,以及修改前该代码块区间的总行数
                # +1,8表示需要修改的代码块在新文件的行号,以及修改后该代码块区间的总行数
 11111111    #块内容 块内容的首列缩进1字符,空白表示引用/未作增删 -表示删去的内容 +表示增加的内容 
-22222222
-33333333
-44444444
+55555555
+66666666
+77777777
 aaaaaaaa
-bbbbbbbb
-cccccccc
-dddddddd
+eeeeeeee
+ffffffff
+gggggggg

5.打patch

旧文件目录

patch -p0 < patch_test.patch

注意!patch必须在旧文件夹中打,否则将会发生错误!
错误如下:
在这里插入图片描述

patch命令的格式

patch将diff生成的补丁记录下的差异信息,应用到旧文件上

patch 选项参数 < 补丁 #    patch中已含有新旧文件的信息,无须将新旧文件作为参数输入

patch的常用选项参数

-pNUM
NUM表示忽略的文件夹层数,忽略patch文件中新旧文件的父目录层数
以desktop/diff_patch_test/old为例
-p0为在desktop目录下找diff_patch_test再找old
-p1则是忽略第一层的desktop目录,直接从当前目录下找diff_patch_test再找old
(存疑)
-E
empty 如果发现空文件,则删除,常见于需要删除旧文件夹中某个旧文件整体的情况,以及恢复补丁时删除之前新写的无效文件
-R
reverse 取消打的补丁

通过patch恢复源文件

当补丁错误时,可以使用-RE选项参数恢复源文件,意为取消打的补丁,并删除空文件

patch -RE -p0 <patch_test.patch

案例2:文件夹的补丁制作与替换

原理基本与上相同
与单个文件不同,在diff制作补丁时,需遍历整个文件夹,因此需要加-r选项参数
注意打补丁时需要到旧文件夹的目录下!
此处的-p1参数,是因为新旧文件夹中的改动通常在new文件夹和old文件夹里,需要忽略首层的old和new文件夹,将内容物替换

# 制作补丁
diff -uNr  old_docu  new_docu  > new_docu.patch
# 打补丁
cd new_docu    #    需要到旧文件夹目录下!
patch -p1 < old_docu.patch    #    注意选项参数-p1

# 如有需要,取消补丁
#patch -R -p1 <new_docu.patch

案例3:git打补丁实战

1.生成

对于git的补丁有两种方案
git diff
生成UNIX标准补丁.diff文件
git format-patch
生成Git专用.patch文件

.diff文件只是记录文件改变的内容,不带有commit记录信息,多个commit可以合并成一个diff文件
.patch文件带有记录文件改变的内容,也带有commit记录信息,每个commit对应一个patch文件

2.检查和应用

检查补丁状态

git apply --stat patch_name.patch

检查补丁是否可打入

git apply --check patch_name.patch

正式打入

git apply patch_name.patch

References

补丁的制作与应用

git生成patch和应用
如何用git生成pitch

目录
相关文章
|
1月前
|
Ubuntu Linux Python
Tkinter错误笔记(一):tkinter.Button在linux下出现乱码
在Linux系统中,使用Tkinter库时可能会遇到中文显示乱码的问题,这通常是由于字体支持问题导致的,可以通过更换支持中文的字体来解决。
112 0
Tkinter错误笔记(一):tkinter.Button在linux下出现乱码
|
3月前
|
Linux
Linux源码阅读笔记10-进程NICE案例分析2
Linux源码阅读笔记10-进程NICE案例分析2
|
3月前
|
Linux
Linux源码阅读笔记09-进程NICE案例分析1
Linux源码阅读笔记09-进程NICE案例分析1
|
29天前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
81 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
3月前
|
安全 Linux 开发者
Linux笔记之ldd命令详解
`ldd`命令是Linux环境下一个非常实用的工具,用于显示一个程序运行时所需的共享库依赖。它帮助开发者和系统管理员快速诊断程序运行问题,特别是在处理"找不到库文件"或者"错误的库文件版本"等错误时。然而,出于安全的考虑,对于不信任的可执行文件,应该慎用 `ldd`命令,可以考虑使用其他工具如 `objdump`。总的来说,懂得如何妥善且安全地使用 `ldd`,对于维护一个稳定和高效的Linux系统来说,是非常重要的。
68 9
|
3月前
|
Linux
Linux源码阅读笔记13-进程通信组件中
Linux源码阅读笔记13-进程通信组件中
|
3月前
|
消息中间件 安全 Java
Linux源码阅读笔记13-进程通信组件上
Linux源码阅读笔记13-进程通信组件上
|
3月前
|
Linux 开发者
Linux源码阅读笔记18-插入模型及删除模块操作
Linux源码阅读笔记18-插入模型及删除模块操作
|
3月前
|
Linux
Linux源码阅读笔记12-RCU案例分析
Linux源码阅读笔记12-RCU案例分析
|
3月前
|
数据采集 Linux
Linux源码阅读笔记20-PCI设备驱动详解
Linux源码阅读笔记20-PCI设备驱动详解