diff 用来比较、输出两份文件(目录)的差异, diff [options] A_file B_file. 在SVN环境下,使用:svn diff 比较、输出当前版本与主线版本之间的改动。一般会将这些输出重定向到.diff文件或.patch文件中。
patch 用来将.diff文件或.patch文件中的改动应用到当前版本上。
1.为单个文件生成补丁
-
[root@236 ~]# diff -up ceph/src/msg/xio/XioMessenger.cc ceph-test/src/msg/xio/XioMessenger.cc
-
--- ceph/src/msg/xio/XioMessenger.cc 2016-08-31 14:17:54.367045868 +0800
-
+++ ceph-test/src/msg/xio/XioMessenger.cc 2016-08-31 16:44:36.828039605 +0800
-
@@ -244,7 +244,7 @@ static int on_msg_error(struct xio_sessi
-
static_cast<XioConnection*>(conn_user_context);
-
CephContext *cct = xcon->get_messenger()->cct;
-
-
- ldout(cct,4) << "msg error session: " << session
-
+ ldout(cct,0) << "msg error session: " << session
-
<< " error: " << xio_strerror(error) << " msg: " << msg
-
<< " conn_user_context " << conn_user_context << dendl;
-
-
[root@236 ~]#
把这条命令产生的输出重定向到一个文件中, 这个文件就是patch.
-
[root@236 ~]# diff -up ceph/src/msg/xio/XioMessenger.cc ceph-test/src/msg/xio/XioMessenger.cc > xio.diff
-
或者
-
[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.为多个文件生成补丁
-
[root@236 ~]# diff -uprN ceph/src/msg/xio/ ceph-test/src/msg/xio/
这条命令对比了ceph/src/msg/xio/和ceph-test/src/msg/xio/两个目录下的所有源码差异. 可以将差异重定向到.diff文件或.patch文件
-
[root@236 ~]# diff -uprN ceph/src/msg/xio/ ceph-test/src/msg/xio/ > xio.diff
参数详解:
-r 递归地对比一个目录和它的所有子目录(即整个目录树).
-N 如果某个文件缺少了, 就当作是空文件来对比. 如果不使用本选项, 当diff发现旧代码或者新代码缺少文件时, 只简单的提示缺少文件. 如果使用本选项, 会将新添加的文件全新打印出来作为新增的部分.
3.打补丁
生成的补丁中, 路径信息包含了你的ceph源码根目录的名称, 但其他人的源码根目录可能是其它名字, 所以, 打补丁时, 要进入你的ceph源码根目录, 并且告诉patch工具, 请忽略补丁中的路径的第一级目录(参数-p1).
-
[root@236 ~]# patch -p1 < patch1.diff //忽略第一级目录
-
[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.还原补丁
-
[root@236 ~]# patch -Rp1 < patch1.diff
命令patch -R < xxx.diff用来将在源码中应用的xxx.diff修改的内容去除掉。
5.示例
给修改过的ceph源码生成patch,然后用生成的patch给未修改过的内核打补丁
其中,目录
ceph-test为未修改过的ceph源码,目录
ceph/为修改过的内核
-
[root@236 ~]# diff -uparN ceph/src/msg/xio/ > xio.diff
-
[root@236 ~]# cd ceph-test/src/msg/xio/
-
[root@236 ~]# patch -p4 < xio.diff // 应用xio.diff修改的内容
-
[root@236 ~]# patch -Rp4 < xio.diff // 去除xio.diff修改的内容
阅读(2261) | 评论(0) | 转发(0) |