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=FILE Output rejects to FILE
-D NAME –ifdef=NAME 用指定的符号把改变的地方标示出来
-m –merge Merge 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=FORMAT Create ‘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 文件后还采用逐行修改的方式进行了。

patch 修补文件命令相关推荐

  1. patch 修补文件(给文件打补丁)

    patch 修补文件(给文件打补丁) 功能:修补文件.使用补丁文件,对源文件进行更改.更改方式根据参数来设定. 倘若一次仅修改一个文件,可直接在指令列中下达指令依序执行.如果配合修补文件的方式则能一次 ...

  2. linux利用patch和diff命令制作文件补丁

    linux利用patch和diff命令制作文件补丁 因为在 u-boot 移植过程中,有几处通用文件要修改,如果每次都要手动修改就太麻烦了.制作补丁可以解决这个问题. 学习资料的收集比较简单,方法一类 ...

  3. linux打补丁要选择目录,Linux下patch打补丁命令实例详解

    linux下patch命令使用详解---linux打补丁命令 功能说明: 修补文件. 语 法: patch [-bceEflnNRstTuvZ][-B ][-d ][-D ][-F ][-g ][-i ...

  4. linux -- patch补丁文件以及相关内容

    本文的目的是向Linux新手介绍一种无价的资源,Larry Wall的patch程序.patch是用来查找文件之间差异的GNU diff命令的一个接口:diff有很多选项,但是该命令最常用的用途是用来 ...

  5. 在linux系统环境中 常用的关机命令,Linux常用基础命令整理:关机命令、查看目录下文件命令等...

    整理了一些Linux常用基础命令,欢迎指正. 首先记住四个热键,学会这四个键,收益一辈子. Tab按键---命令补齐功能 Ctrl+c按键---停掉正在运行的程序 Ctrl+d按键---相当于exit ...

  6. Linux之查找文件命令

    Linux之查找文件命令 1. find命令及选项的使用 命令 说明 find 在指定目录下查找文件(包括目录) find命令选项: 选项 说明 -name 根据文件名(包括目录名)字查找 find命 ...

  7. oracle取32位唯一码,Oracle导出导入dmp文件命令,以及excel生成32位uuid

    Oracle导出dmp文件命令,以及excel生成64位uuid 导出命令cmd中 expdp mms/xfkjerp@orcl schemas=mms dumpfile=expdp.dmp DIRE ...

  8. Linux 创建、删除、修改 文件夹 文件命令(笔记)

    国家字符集标准和其它 ASCII: (American Standard Code for Information Interchange) 美国信息交换标准代码 基于拉西字母的一套电脑编码系统,它主 ...

  9. ReactNative生成android平台的bundle文件命令

    ReactNative生成android平台的bundle文件命令 2016年11月03日 23:23:28 阅读数:4869 注:如果assets文件没有正确生成,需要手机创建或授权 网上的其它的很 ...

最新文章

  1. 一个比特币要挖多久?
  2. 断言(assert)详解
  3. Visual Studio 2010 单元测试之一---普通单元测试:http://blog.csdn.net/tjvictor/archive/2011/02/09/6175362.aspx...
  4. java中IO流详解
  5. linux压缩命令(二)bzip2总结
  6. 基于JAVA+SpringMVC+Mybatis+MYSQL的医院HR人事管理系统
  7. ASP.Net页面保存持久数据的几种方法比较
  8. Android:制作Update.zip升级包 【转】
  9. N个数选出M个最小或最大值算法
  10. win7网上邻居_win7网上邻居寻找教程
  11. blob/text column 'content' used in key specification without a key length
  12. 国学大师林语堂献宝:英文学习八要诀
  13. 在苹果Mac上如何恢复已删除的用户?
  14. html之简单新闻网制作
  15. 属鸡适不适合学计算机,生肖属相鸡适宜什么职业(详解)
  16. 漫步者lollipods如何调节音量_漫步者LolliPods怎么配对双耳-使用教程
  17. Hashtable和Hashset
  18. 【minimal problem】资料整理
  19. Unity 3D美术(程序+美术遇到的常见问题)
  20. Linux 磁盘空间释放问题

热门文章

  1. js中for-in的用法
  2. 使用Python搭建Gitee图床
  3. 了解ES6 The Dope Way第五部分:类,转译ES6代码和更多资源!
  4. html怎么显示一个点赞的心形,jquery心形点赞关注效果的简单实现
  5. 基于DLNA的移动端网络视频投屏技术
  6. 一种锂电池充放电及外部供电自动切换的电路
  7. 产品经理撰写需求文档
  8. 【UE】三步创建自动追踪自爆可造成伤害的敌人
  9. vue 跳转页面删除当前tab
  10. python3-excel数据填充