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

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

语法:patch   [OPTION]   [ORIGFILE]  [PATCHFILE]

 

输入选项
-p NUM --strip=NUM 去除相对路径层次的数目
-F LINES --fuzz LINES 设置监别列数
-l --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 标志否决。
  • 默认,ORIGFILEPATCHFILE 替换。若ORIGFILE(原始文件)不存在时,PATCHFILE(补丁文件)根据差别列表,创建 ORIGFILE 文件。
  • 指定 -b 标志时,ORIGFILE(原始文件)会备份在自身的文件中,只是在文件名后附加了后缀 .orig。使用 -o 标志也可以指定输出的目的地。

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

 

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