patch 修补文件命令

article/2025/9/25 2:26:56

patch 修补文件命令

  • patch 修补文件命令
  • 操作练习:
    • 针对单个文件的修改补丁
    • 针对文件目录下所有文件的修改补丁
  • 补充:svn生成补丁文件和打补丁文件
  • 总结


patch 修补文件命令

功能:修补文件,使用补丁文件,对源文件进行更改。更改方式根据参数设定。并且能够使用命令配合修补文件的方式一次性修补大批文件。

使用语法:

patch [option] [origfile] [patchfile]

参数选项:

输入选项
-p NUM–strip=NUM去除相对路径层次的数目
-F LINES–fuzz LINES设置鉴别列数
-I–ignore–whitespace忽略修补数据与输入数据的跳格,空格字符
-c–context把修补数据解释成关联性的差异
-e–ed把修补数据解释成 ed 指令可用的叙述文件
-n–normal把修补数据解释成一般性的差异
-u–unified把修补数据解释成一致化的差异
-N–forward忽略修补的数据较原始文件的版本更旧,或该奔波的修补数据已使用过
-R–reverse假设修补数据是由新旧文件交换位置而产生
-i PATCHFILE–input=PATCHFILE读取指定的修补文件

输出选项
-o FILE–output=FILE设置输出文件的名称,修补过的文件会以该名称存放
-r FILE–reject-file=FILEOutput rejects to FILE
-D NAME–ifdef=NAME用指定的符号把改变的地方标示出来
-m–mergeMerge using conflict markers instead of creating reject files
-E–remove-empty-files若修补过后输出的文件其内容是一片空白,则移除该文件
-Z–set-utc把修补过的文件更改,存取时间设为UTC
-T–set-time此参数的效果和指定"-Z"参数类似,但以本地时间为主
–quoting-style=WORD使用WORD引述类型显示项目名称,可设定值有literal,shell,shell-always,c,escape

备份和版本控制选项
-b–backup备份每一个原始文件
–backup-if-mismatch在修补数据不完全吻合,且没有刻意指定要备份文件时,才备份文件
–no-backup-if-mismatch在修补数据不完全吻合,且没有刻意指定要备份文件时,不要备份文件
-V STYLE–version-control=STYLE用"-b"参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,这个字符串不仅可用"-z"参数变更,
当使用"-V"参数指定不同备份方式时,也会产生不同字尾的备份字符串
-B PREFIX–prefix=PREFIX设置文件备份时,附加在文件名称前面的字首字符串,该字符串可以是路径名称
-Y PREFIX–basename-prefix=PREFIX设置文件备份时,附加在文件基本名称开头的字首字符串
-z SUFFIX–suffix=SUFFIX此参数的效果和指定"-B"参数类似,差别在于修补作业使用的路径与文件名若为src/linux/fs/super.c,加上"backup/"字符串后,文件super.c会备份于/src/linux/fs/backup目录里
-g NUM–get=NUM设置以RSC或SCCS控制修补作业

其他选项
-t–batch自动略过错误,不询问任何问题
-f–force此参数的效果和指定"-t"参数类似,但会假设修补数据的版本为新版本
-s–quiet 或 --silent不显示指令执行过程,除非发生错误
–verbose显示详细的过程信息
–dry-run实际上不改变任何文件;演示讲会发生什么
–posix符合POSIX标准
-d DIR–directory=DIR先改变工作目录到指定的目录
–reject-format=FORMATCreate ‘context’ or ‘unified’ rejects
–binary以二进制方式读写数据
–read-only=BEHAVIOR如何处理只读输入文件:“忽视”,他们是只读的,“警告”(默认),或“失败”

注意:

patch 命令(默认)使用从标准输入读入的源文件 < PATCHFILE ,但是使用 -i PATCHFILE 设置。源文件包含由 diff 命令产生的差别列表(或者 diff 列表)。差异列表是比较两个文件和构建关于如何纠正差别的指示信息的结果。差异列表有三种格式:正常、上下文或者是 ed 编辑器风格。patch 命令确定差异列表格式,除非被 -c、-e 或 -n 标志否决。默认,ORIGFILE 被PATCHFILE 替换。若ORIGFILE(原始文件)不存在时,PATCHFILE(补丁文件)根据差别列表,创建 ORIGFILE 文件。指定 -b 标志时,ORIGFILE(原始文件)会备份在自身的文件中,只是在文件名后附加了后缀 .orig。使用 -o 标志也可以指定输出的目的地。

patch常用选项:

  • -r 是一个递归选项,设置了这个选项,diff会将两个不同版本源代码目录中的所有对应文件全部都进行一次比较,包括子目录文件。
  • -N 选项确保补丁文件将正确地处理已经创建或删除文件的情况。
  • -u 选项以统一格式创建补丁文件,这种格式比缺省格式更紧凑些。
  • -p0 选项从当前目录查找目的文件(夹)(直接使用补丁文件里面指定的路径)
  • -p1 选项忽略掉第一层目录,从当前目录查找(去掉补丁文件指定路径最左的第1个’/'及前面所有内容)。
  • -E 选项说明如果发现了空文件,那么就删除它
  • -R 选项说明在补丁文件中的“新”文件和“旧”文件现在要调换过来了(实际上就是给新版本打补丁,让它变成老版本)

操作练习:

具体操作命令如下:

针对单个文件的修改补丁

$ diff –uN from_file to_file > demo_to_file.patch
$ patch –p0 < demo_to_file.patch		# 对 from 文件操作,使其提升为 to 文件
$ patch –RE –p0 < demo_to_file.patch # 对当前文件操作,使其恢复为 from 文件

在这里插入图片描述
在这里插入图片描述

针对文件目录下所有文件的修改补丁

$ diff –uNr from_dir to_dir > demo_to_dir.patch
$ patch –p1 < demo_to_dir.patch	# 打补丁,使得成为新版本文件
$ patch –R –p1 < demo_to_dir.patch	# 恢复补丁,使其回到补丁前版本

创建如下示例工程目录结构:

在这里插入图片描述

其中主要文件内容如下:

  • Makefile
BOOT_DIR=$(shell pwd)
CC=gccobj_src=${shell find $(BOOT_DIR) -name "*.c"} 
objs=${patsubst %.c,%.o,$(obj_src)}
deps=${patsubst %.c,%.d,$(obj_src)}CFLAGS=-I${BOOT_DIR}/common
OBJ=demoall:${objs}${CC} ${CFLAGS} $< -o ${OBJ}
%.o:%.c${CC} ${CFLAGS} $< -c -o $@clean:-rm ${objs}-rm ${OBJ}
  • common/base.h
#ifndef BASE__H
#define BASE__h#define VERSION 1#endif
  • ext/ext.t
# 空文件
  • main/main.c
#include <stdio.h>
#include "base.h"int main()
{printf("Hello world!\n");printf("Current Version : %d\n", VERSION);return 0;
}

可以尝试如下操作, 我们将通过修改其中 common/base.h 文件中的版本信息宏定义来进行演示,先 make 构建工程进行演示,如下:

在这里插入图片描述可以看到其中的当前显示版本号为 1 ,接下来将进行修改。复制一个当前工程为 new_src ,

$ cp -rf old_src new_src
$ cd new_src/common/
$ vim base.h

将对应的版本号修改为 2 或者其他。具体如下:

在这里插入图片描述
生成补丁操作:

$ diff -uNr old_src new_src > demo.patch

生成补丁内容如下:

在这里插入图片描述这里生成的补丁文件 demo.patch 就可以用来将 old_srcnew_src 进行同步了。当我们只有 old_src 时,我们拿到 demo.patch 补丁,通过如下操作可以对源代码进行修改同步,而不需要逐行修改,具体如下:

$ mv demo.patch old_src/
$ cd old_src
$ patch -p1 < demo.patch

显示如下:

在这里插入图片描述可以看到 patch 的输出结果,修改了对应的文件 common/base.h ,并且经过编译后程序输出的版本信息已经修改为新版本的 2

此外,还能对新版本进行恢复操作,具体如下:

$ mv demo.patch new_src/
$ cd new_src
$ patch -R -p1 < demo.patch

显示如下:

在这里插入图片描述

补充:svn生成补丁文件和打补丁文件

生成补丁文件:
svn diff > patchFile 整个工程的变动生成补丁
或 svn diff file > patchFile 某个文件单独变动的补丁

svn回滚:
svn revert FILE 单个文件回滚
svn revert DIR --depth=infinity 整个目录进行递归回滚

打patch:
patch -p0 < test.patch -p0 选项要从当前目录查找目的文件

patch -p1 < test.patch -p1 选项要从当前目录查找目的文件,不包含patch中的最上级目录
例如两个版本以a,b开头,而a,b并不是真正有效地代码路径,则这时候需要使用"-p1"参数。
a/src/…
b/src/…

总结

linuxpatch 命令的学习中,我们发现原来在 linux 环境下修改保存文件的版本信息如此简单,其实在很多的代码版本管理中也都是用到了这样的操作和版本变更的信息记录,例如经常用到的 git svn 等等工具,我们都能够在其中发现 patch 的声影。

通过本章的学习,相信大家在日后码代码的过程中,再也不会遇到类似 patch 文件后还采用逐行修改的方式进行了。 😃


http://chatgpt.dhexx.cn/article/xJvaiTDF.shtml

相关文章

patch-package给依赖打补丁实例详解

1、安装patch-package patch-package 官方只支持 npm 和 yarn。注意&#xff1a;不要使用cnpm yarn add patch-package -D 2、创建补丁 先修改依赖文件&#xff0c;然后运行patch-package来创建patch文件了。我这里用element-ui来举例子 yarn patch-package element-ui 此时&…

diff和patch工具打补丁

diff和patch工具打补丁 1 对比单个文件差异1.1 编写两个版本的脚本&#xff0c;一个为v1版本&#xff0c;一个为v2版本。2.2 使用diff命令语法 2 使用patch命令对单文件代码打补丁2.1 生成补丁文件2.2 使用patch命令打补丁 3 对比目录中所有文件的差异3.1 准备实验环境3.2 对比…

【知识点】patch补丁文件格式

linux补丁文件格式 “补丁” 指的是文件之间一系列差异。 在原始文件的基础上进行修改后&#xff0c;然后根据所做的修改生成补丁文件&#xff08;使用diff命令&#xff09;。 一个持有原始文件的人&#xff0c;将该补丁打到原始文件上&#xff08;使用patch命令&#xff09…

Git 补丁— diff 和 patch 使用详解

Git 补丁— diff 和 patch 使用详解 1. diff 和 patch 的区别2. 生成patch2.1 git diff3. git format-patch 3. 应用patch4. 冲突解决题外话 1. diff 和 patch 的区别 Git 提供了两种补丁方案&#xff0c;一种是通过 git diff 生成的 .diff 文件&#xff0c;第二种是通过 git …

手把手教你使用patch-package给npm包打补丁

具体文档https://github.com/ds300/patch-package 一、背景 故事从日常团队协作开发展开&#xff0c;整个team使用react antd4搭建前端页面&#xff0c;在开发中我发现antd4.9.*版本的Input.TextArea组件存在一个bug&#xff0c;该bug表现为maxLength属性限制不符合预期&…

patch-package打补丁

如何修改node_modules源码&#xff1f; 首先&#xff0c;我们能想到的思路是直接修改第三方库的代码&#xff0c;不过这会带来团队协作的问题&#xff0c;你的改动需要同步到团队所有成员&#xff0c;比较麻烦。 好在&#xff0c;我们可以使用patch-package这个库来解决这类问题…

Git 打patch (打补丁)的使用

patch 的使用 一般是diff ,apply ,format-patch,am 1 生成patch git diff > test.patch 这个是打补丁(test.patch自己取的名字,这个命令可以看出没有指定修改的问题所以默认把所有修改的文件都打patch了,同时还需要注意,这里是本地修改的没有执行add缓存的) 如果想指定某…

linux基本功系列之fdisk命令实战

文章目录 前言一. fdisk命令介绍二. 语法格式及常用选项三. 参考案例3.1 列出每个分区的大小3.2 分区操作3.2.1 添加硬盘3.2.2 开启虚拟机并分区3.3.3 分区完成后进行格式化挂载 四 . 设置分区自动挂载 前言 大家好&#xff0c;又见面了&#xff0c;我是沐风晓月&#xff0c;本…

fdisk磁盘分区

fdisk磁盘分区 fdisk磁盘分区 fdisk磁盘分区文件系统类型fdisk分区过程 文件系统类型 EXT4 第四代扩展文件系统 存放数据 SWAP 交换文件系统 交换分区 fdisk fdisk 参数 fdisk -l 查看所有磁盘磁盘分区 fdisk命令 格式fdisk 磁盘设备 常用选项&#xff1a; m&#xff1a;查…

linux fdisk原理,fdisk详细剖析笔记

fdisk 简单使用 fdisk 工具原理就是修改磁盘的分区表&#xff0c;和分区信息。 查看帮助 #fdisk --help (1)磁盘列表 #fdisk -l (2)管理某个磁盘 #fdisk /dev/sdb 交互模式&#xff0c;可以直接m查看帮助信息&#xff0c;后面可以使用非交互模式&#xff0c;脚本自动格式化 磁盘…

Linux基础命令-fdisk管理磁盘分区表

文章目录 fdisk 命令介绍 命令格式 基本参数 1&#xff09;常用参数 2&#xff09;fdisk菜单操作说明 创建一个磁盘分区 1&#xff09;创建分区 2&#xff09;创建交换分区 参考实例 1&#xff09; 显示当前分区的信息 2&#xff09; 显示每个磁盘的分区信息 命令…

linux磁盘分区fdisk命令详解及云硬盘挂载实操

linux磁盘分区fdisk命令详解 1、什么是分区&#xff1f; 分区是将一个硬盘驱动器分成若干个逻辑驱动器&#xff0c;分区是把硬盘连续的区块当做一个独立的磁硬使用。分区表是一个硬盘分区的索引,分区的信息都会写进分区表。 2、为什么要有多个分区&#xff1f; 防止数据丢失…

linux磁盘挂载之fdisk

linux磁盘挂载&#xff0c;使用fdisk命令 fdisk可以支持2T以下的分区的挂载&#xff0c;如果分区大于2T需要使用parted工具 磁盘情况查看 fdisk -l 可以看到有两块物理盘 名称磁盘符号磁盘大小备注Disk/dev/sda214.7G已分区Disk/dev/sdb1073.7G未分区 如果disk中有Device项…

fdisk分区命令

fdisk是Linux系统中最常用的分区工具&#xff0c;通过这个命令也可以查看系统中所有可用的分区&#xff0c;但是这个命令只支持MBR的分区表(这句话应该只对某些系统&#xff0c;CentOS7-1810适用&#xff0c;Debian9.5和openSUSE15应该已经支持GPT分区表&#xff0c;下面对fdis…

fdisk分区工具

fdisk分区工具 Linux磁盘分区步骤常见Linux分区方案 常见分区表MBR分区表使用fdisk进行分区fdisk手动创建主分区0查看磁盘详情1执行fdisk2选择新建分区3选择主分区4输入分区编号5输入起始扇区6输入结束扇区7查看分区表信息8保存分区9查看分区是否新增成功10同步分区信息11再次查…

linux中磁盘分区fdisk,管理磁盘分区之fdisk详解

Mozatr的不定期更新,处于学习阶段的Mozart,愿不断分享,不断进步。 此次分享一个重要的管理分区命令:fdisk ,我们一一阐述。 (一)分区 首先我们了解下什么是分区,分区是将一个硬盘驱动器分成若干个逻辑驱动器,分区是把硬盘连续的区块当做一个独立的磁盘使用。分区表是一个…

一天一个 Linux 命令(26):fdisk 命令

本文为joshua317原创文章,转载请注明&#xff1a;转载自joshua317博客 一天一个 Linux 命令&#xff08;26&#xff09;&#xff1a;fdisk 命令 - joshua317的博客 一、简介 Linux里的fdisk&#xff08;英文全称&#xff1a;"Partition table manipulator for Linux&quo…

Linux命令之磁盘分区fdisk

概述 fdisk 命令可以查看磁盘分区情况和为磁盘进行分区。分区类似于让一个大房子用墙壁按照功能划分为卧室、厕所、厨房、阳台等。 注&#xff1a;物理硬盘可以分为一个或多个逻辑磁盘&#xff0c;称之为分区。但不要在当前的硬盘上尝试该命令&#xff0c;一定要再找一块新磁盘…

UNetVNet

Unet论文地址&#xff1a;https://arxiv.org/abs/1505.04597 Vnet论文地址&#xff1a;http://campar.in.tum.de/pub/milletari2016Vnet/milletari2016Vnet.pdf UNet被广泛应用于医学图像处理&#xff0c;encoder下采样4次&#xff0c;一共下采样16倍&#xff0c;对称地&#…

黑科技VNET——最好用的Android抓包神器

VNET是Android平台下功能最强大的网络抓包工具&#xff0c;支持HTTP&HTTPS&#xff0c;TCP&UDP&#xff0c;IPv6&IPv4&#xff0c;多终端显示&#xff0c;功能十分的强大。