diff命令和patch命令

Linux就这个范儿

2.9.5 文件对比命令——diff

diff命令
搭建网站离不开数据库,在Linux系统上我们使用源码安装了MySQL服务器。不久我们发现 Google发布了一系列MySQL补丁,这些补丁很好很强大,这时候我们迫不及待地要把新东西更新到系统上,那就用patch命令来打补丁吧。喝水不忘打井人,那补丁又是怎么做的呢?这个任务就需要文件对比命令diff来帮忙了。
diff用来比较两个文本文件的差异,是代码版本管理的基石之一。diff采用动态规划算法实现差异比较,此算法的基础是最长公共子序列,特复杂的

,有兴趣的话可以读读科曼的《算法导论》。
diff提供了正常(normal diff)、上下文(context diff)和合并(unified diff)三种格式告诉你两个文件的差异。正常格式的diff不太容易读,上下文格式的diff 在文件相似度比较高的情况下会显示大量重复的内容,很浪费空间。

1990年,GNU diff率先推出了“合并格式”的diff,使用类似

diff -urfile01_old file01_new > file01.patch

命令就可将变动前和变动后的文件的上下文合并在一起显示。我举个例子咱们一起看看执行完diff -ur后产生的patch文件。
72 === modified file ‘configure.in‘
73 --- configure.in 2011-06-06 13:53:46 +0000
74 +++ configure.in 2011-07-27 21:10:40 +0000
75 @@ -361,15 +361,11 @@
76
77 if test "$GCC" = "yes"
78 then
79 - # mysqld requires -fno-implicit-templates.
80 - # Disable exceptions as they seams to create problems with gcc and threads.
81 # mysqld doesn‘t use run-time-type-checking, so we disable it.
82 # We should use -Wno-invalid-offsetof flag to disable some warnings from gcc
83 # regarding offset() usage in C++ which are done in a safe manner in the
84 # server
85 - CXXFLAGS="$CXXFLAGS -fno-implicit-templates -fno-exceptions -fno-rtti"
86 - AC_DEFINE([HAVE_EXPLICIT_TEMPLATE_INSTANTIATION],
87 - [1], [Defined by configure. Use explicit template instantiation.])
88 + CXXFLAGS="$CXXFLAGS -fno-rtti"
89 fi
90
91 MYSQL_PROG_AR

73-74行是文件的基本信息。
--- configure.in 2011-06-06 13:53:46 +0000
+++ configure.in 2011-07-27 21:10:40 +0000
“---”表示变动前的文件,“+++”表示变动后的文件。
75行处变动的位置用两个@作为起首和结束。
  @@ -361,15 +361,11 @@
“-361,15”分成三个部分:减号表示第一个文件,“361”表示第361行,“15”表示连续15行,也就是表示下面是第一个文件从第361行开始的连续15行。同样道理,“+361,11”表示第二个文件从第361行开始的连续11行。
从 patch 文件的76行开始除了显示有变动的那些行外,还把这两个文件的上下文合并显示在一起。每一行最前面是标志位,空表示无变动,减号表示第一个文件删除的行,加号表示第二个文件新增的行。



patch命令
应用patch命令打补丁,命令虽不复杂,也是考验人品的机会,有时候不是打一次patch就成功完成软件更新的。

1、首先要选择好更新软件相同版本的补丁,版本不对的话patch是打不上去的,例如google patch只能加在某些版本的MySQL之上。

2、其次确定是否需要逐层打patch,例如google patch的 GlobalTransactionIds功能包含在patch v3内,但是如果只打patch v3的话,编译是通不过的,没办法只能一层一层打patch(v1->v2->v3)

还有经常会遇到应用补丁到整个目录的,别忘了设置p级别,因为对于补丁文件而言,需要打补丁的文件在你电脑上的路径名跟在创建补丁的电脑上可能不同,

p级别会告诉patch命令忽略掉路径名的几个部分以正确的识别文件。例如,如果你在demo.patch文件里看到这样一个文件名:

/home/fangru/mysql-test/extra/rpl_tests/rpl_foreign_key.test

而你当前正工作在

mysql-test/extra/rpl_tests/rpl_foreign_key.test

我们来算一下p级别,方法是计算从路径最开始应删除几个路径分隔符后剩下的部分才与你的工作目录相一致

在这个例子中p应为3,所以需要使用 patch –p3 < demo.patch 。在出现不匹配的情况时,patch会生成rej文件,你可以手工修改记录失败的地方

nginx的ngx_req_status-master模块打补丁

yum -y install patch unzip gcc

cd /mydata/download/lnmppack/nginx-1.6.3
patch -p1 < /usr/local/nginx_upstream_check_module-master/check_1.5.12+.patch
patch -p1 < /usr/local/ngx_req_status-master/write_filter.patch

时间: 2024-10-04 00:48:32

diff命令和patch命令的相关文章

打补丁patch 命令使用

http://www.cnblogs.com/huanghuang/archive/2011/07/14/2106402.html patch 命令用于打补丁,补丁文件是使用diff产生的patch 命令语法 patch [ -b [ -B Prefix ] ] [ -f ] [ -l ] [ -N ] [ -R ] [ -s ] [ -v ] [ -c | -e | -n ] [ -d Directory ] [ -D Define ] [ -F Number ] [ -i PatchFile

&lt;转载&gt; diff 和 patch 命令

本文转载自:http://blog.chinaunix.net/uid-23390992-id-3312321.html diff与patch命令 diff与patch命令真可谓是天作之合,命令中的黄金搭档.老师讲了之后其实自己不是很懂,因为上课的时候没有好好听,上课走神了.怎么办呢,肯定不能放着不管了,而这两个命令确实很重要,所以只能厚着脸皮课后死啃资料自己学习咯,学了之后才有开头第一句的感慨. diff和patch是一对工具,数学上说,diff是对两个集合的差运算,patch是对两个集合的和

Linux中的版本控制---diff和patch命令

一.构造两个用于测试的文件 hello.txt: world.txt: 二.用diff命令比较两个文本文件的差异 对这个两个文本文件执行diff‘命令,并通过输出重定向,将差异保存在diff.txt文件中 $ diff -u hello.txt world.txt > diff.txt 参数-u是使得差异输出中带有上下文 第1,2行中的三个减号标识原始文件,三个加号标识目标文件: 第3行表示在这个差异小节中,是从原始文件的第1行开始之后的3行,目标文件从第1行到第3行: 从第4行开始的减号表示只

diff patch 命令制作补丁

diff 命令 diff可以比较两个文件,并可同时记录下二者的区别.制作补丁时的一般用法和常见选项为: diff [选项] 源文件(夹) 目的文件(夹) -r:递归,设置后diff会将两个不同版本源代码目录中的所有对应文件都进行一次比较,包括子目录文件: -N:确保补丁文件将正确地处理已经创建或删除文件的情况: -u:一体化diff输出(参见例1) -E, -b, -w, -B, –strip-trailing-cr 忽略各种空白,可参见文档,按需选用. 例1,有如下两个差异文件: # vers

【转】patch命令

原文网址:http://bbs.chinaunix.net/thread-1945698-1-1.html patch给文件1应用补丁文件变成另外一个文件2(需要先用"diff 文件1 文件2"生成补丁文件).语法patch [选项] [原始文件 [补丁文件]] 描述: patch 命令读取如何更改文件的源文件指示信息,然后应用这些更改.源文件包含由 diff 命令产生的差别列表(或者 diff 列表).差异列表是比较两个文件和构建关于如何纠正差别的指示信息的结果.缺省情况下,patc

[笔记]内置命令与外部命令

内置命令(bulidin command):Bash程序本身提供,不需要到$PATH中查找,执行效率高外部命令:独立存在与文件系统中的可执行文件,文件需要存在于$PATH中        判断方法:type COMMAND 注意:Linux中严格区分大小写!!! 常见的内置命令:    help: 显示所有内置命令列表或单个内置命令的用法    type:判断命令的类型是内置还是外部命令    echo:显示,默认自动换行(加 -n 选项取消换行)    printf:依照格式显示参数内容,与C

cmd命令和linux命令的区别

cmd命令和linux命令看起来很相似,都是在一个控制台输入一些特定的指令去完成一些特定的操作.可是用过的朋友就会发现这些指令是有很多不同的,可是到底有什么不同,要说又说不上来,所以要了解一下. cmd命令的起源:DOS DOS(Disk Operating System,磁盘操作系统),是Windows系统之前的一个操作系统名称,属于单用户单任务式的,特点通常是黑底白字,用户全靠键盘输入命令来完成所有工作.之后Windows诞生了,属于多用户多任务式的(系统名称都是多窗口),初期当然还得使DO

https://www.jqhtml.com/30047.html strace + 命令: 这条命令十分强大,可以定位你程序到底是哪个地方出了问题

https://www.jqhtml.com/30047.html 我的Linux手册 服务器 浏览数:72 2019-1-30 原文链接 基础安装 # CentOS sudo yum install epel-release 命令行Tips 进程及端口 # 查看端口占用情况 netstat -ap | grep 端口号   # 查看某一个端口 netstat -ntlp top -p 进程ID:查看进程的实时情况,包括内存大小,内存占用率.CPU占用率,运行时间 cat /proc/进程ID/

linux简单命令3---帮助命令

1:帮助命令:man 命令: 2:这个帮助用的比较多(还是中文):命令  --help 3:shell帮助 4:详细命令(比man更详细)帮助,用的少,比较麻烦:info