Chinaunix首页 | 论坛 | 博客
  • 博客访问: 804658
  • 博文数量: 274
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 862
  • 用 户 组: 普通用户
  • 注册时间: 2015-10-24 15:31
个人简介

不合格的程序猿

文章分类

全部博文(274)

文章存档

2019年(3)

2018年(1)

2017年(4)

2016年(160)

2015年(106)

我的朋友

分类: 系统运维

2016-09-03 15:40:58

diff 用来比较、输出两份文件(目录)的差异, diff [options] A_file B_file. 在SVN环境下,使用:svn diff 比较、输出当前版本与主线版本之间的改动。一般会将这些输出重定向到.diff文件或.patch文件中。

patch 用来将.diff文件或.patch文件中的改动应用到当前版本上。

1.为单个文件生成补丁


点击(此处)折叠或打开

  1. [root@236 ~]# diff -up ceph/src/msg/xio/XioMessenger.cc ceph-test/src/msg/xio/XioMessenger.cc
  2. --- ceph/src/msg/xio/XioMessenger.cc    2016-08-31 14:17:54.367045868 +0800
  3. +++ ceph-test/src/msg/xio/XioMessenger.cc    2016-08-31 16:44:36.828039605 +0800
  4. @@ -244,7 +244,7 @@ static int on_msg_error(struct xio_sessi
  5.      static_cast<XioConnection*>(conn_user_context);
  6.    CephContext *cct = xcon->get_messenger()->cct;
  7.  
  8. - ldout(cct,4) << "msg error session: " << session
  9. + ldout(cct,0) << "msg error session: " << session
  10.      << " error: " << xio_strerror(error) << " msg: " << msg
  11.      << " conn_user_context " << conn_user_context << dendl;
  12.  
  13. [root@236 ~]#

把这条命令产生的输出重定向到一个文件中, 这个文件就是patch.


点击(此处)折叠或打开

  1. [root@236 ~]# diff -up ceph/src/msg/xio/XioMessenger.cc ceph-test/src/msg/xio/XioMessenger.cc > xio.diff
  2. 或者
  3. [root@236 ~]# diff -up ceph/src/msg/xio/XioMessenger.cc ceph-test/src/msg/xio/XioMessenger.cc > xio.patch

参数详解:

-u 显示有差异行的前后几行(上下文), 默认是前后各3行, 这样, patch中带有更多的信息.
-p 显示代码所在的c函数的信息.

2.为多个文件生成补丁


点击(此处)折叠或打开

  1. [root@236 ~]# diff -uprN ceph/src/msg/xio/ ceph-test/src/msg/xio/
这条命令对比了ceph/src/msg/xio/ceph-test/src/msg/xio/两个目录下的所有源码差异. 可以将差异重定向到.diff文件或.patch文件

点击(此处)折叠或打开

  1. [root@236 ~]# diff -uprN ceph/src/msg/xio/ ceph-test/src/msg/xio/ > xio.diff
参数详解:
-r 递归地对比一个目录和它的所有子目录(即整个目录树).
-N 如果某个文件缺少了, 就当作是空文件来对比. 如果不使用本选项, 当diff发现旧代码或者新代码缺少文件时, 只简单的提示缺少文件. 如果使用本选项, 会将新添加的文件全新打印出来作为新增的部分.

3.打补丁

生成的补丁中, 路径信息包含了你的ceph源码根目录的名称, 但其他人的源码根目录可能是其它名字, 所以, 打补丁时, 要进入你的ceph源码根目录, 并且告诉patch工具, 请忽略补丁中的路径的第一级目录(参数-p1).

点击(此处)折叠或打开

  1. [root@236 ~]# patch -p1 < patch1.diff //忽略第一级目录
  2. [root@236 ~]# patch -p2 < patch1.diff //忽略第二级目录
diff命令必须在目标根目录的上一级目录中执行.
参数 -p 用来忽略目录,比如:src目录是/root/aa/bb/cc/,dest目录是/root/11/22/cc,在/root/目录下用:diff aa/bb/cc 生成cc.diff,要在/root/目录下对11/22/cc应用pacth,发现前两级目录aa/bb和11/22不一致,就需要在/root/目录下使用:patch -p2 < cc.diff

4.还原补丁

点击(此处)折叠或打开

  1. [root@236 ~]# patch -Rp1 < patch1.diff
命令patch -R < xxx.diff用来将在源码中应用的xxx.diff修改的内容去除掉。

5.示例

给修改过的ceph源码生成patch,然后用生成的patch给未修改过的内核打补丁
其中,目录ceph-test为未修改过的ceph源码,目录ceph/为修改过的内核

点击(此处)折叠或打开

  1. [root@236 ~]# diff -uparN ceph/src/msg/xio/ > xio.diff
  2. [root@236 ~]# cd ceph-test/src/msg/xio/
  3. [root@236 ~]# patch -p4 < xio.diff // 应用xio.diff修改的内容
  4. [root@236 ~]# patch -Rp4 < xio.diff // 去除xio.diff修改的内容


阅读(2261) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~