Linux & Android生成和应用Patch文件
Posted 中国思想史
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux & Android生成和应用Patch文件相关的知识,希望对你有一定的参考价值。
若我们发现项目有bug,而自己没有代码提交权限,此时最合适的解决方法就是用diff命令做一个补丁分发给项目成员。项目成员通过patch命令可了解你的意图。
Patch 过程:
(1) 用diff工具比较新旧代码,生成patch文件(diff功能就是用来比较两个文件不同,然后记录下来);
(2) 使用patch命令,将patch文件合并到原有代码;
(3) 检查是否存在无法patch的文件,修改或重新选择是否对其做patch。patch打完就可以直接编译了。通常在makefile中加入patch命令,然后编译代码。
补丁头分别用—/+++来表示要打补丁的文件。 — 开头表示旧文件, +++ 开头表示新文件。
一个补丁文件可能包含以 —/+++ 开头的很多节,每一节用来打一个补丁。所以一个补丁文件中可包含好多个补丁。
块是补丁中要修改的地方,他们通常以@@开始,用来表示要修改的位置。结束于另一个块的开始或者一个新的补丁头。块会缩进一列,而这一列是用来表示这一行是要增加还是要删除的。块的第一列:
+号表示这一行是要加上的。
-号表示这一行是要删除的。
没有加号也没有减号表示这里只是引用的而不需要修改。
打补丁
1、为单个文件生成补丁
diff -up linux-4.9/net/sunrpc/svc.orig.c linux-4.9/net/sunrpc/svc.c > patch
参数:
-u 显示有差异行的前后几行(上下文), 默认是前后各3行, 这样, patch中带有更多的信息.
-p 显示代码所在的函数的信息.
- 为多个文件生成补丁
diff -uprN linux-4.9.orig/net/sunrpc/ linux-4.9/net/sunrpc/ > patch
这条命令对比了linux-2.6.28.8.orig/net/sunrpc/和linux-2.6.28.8/net/sunrpc/两个目录下的所有源码差异.
参数详解:
-r 递归地对比一个目录和它的所有子目录(即整个目录树).
-N 如果某个文件缺少了, 就当作是空文件来对比. 如果不使用本选项, 当diff发现旧代码或者新代码缺少文件时, 只简单的提示缺少文件. 如果使用本选项, 会将新添加的文件全新打印出来作为新增的部分.
生成的补丁中, 路径信息包含了你的Linux源码根目录的名称, 但其他人的源码根目录可能是其它名字, 所以, 打补丁时, 要进入你的Linux源码根目录, 并且告诉patch工具, 请忽略补丁中的路径的第一级目录(参数-p1).
$ patch -p1 < patch1
diff命令必须在整个Linux源码的根目录的上一级目录中执行.
示例:
给修改过的内核生成patch,然后用生成的patch给未修改过的内核打补丁。
其中,目录linux-4.9为未修改过的内核,目录linux-4.9_1为修改过的内核
1 $ diff -uparN linux-4.9 linux-4.9_1/ > mypatch
2 $ cd linux-4.9
3 $ patch -p1 < mypatch
打完补丁后,需要检查一下有没有拒绝执行的文件,即检查.rej文件的存在。使用命令:
$find . -name *.rej
如果发现,会将其输出到标准输出终端,默认屏幕。当然,你也可以采用重定向,输出到指定文件,比如reject。
$fine . -name *.rej >reject
然后可以查看reject的内容了。
android补丁的生成和应用:
把某个commit做成补丁:
git format-patch -1 指定commit号 //生成指定commit号的补丁
git format-patch -3 //从当前分支最新提交点往下共生成3个补丁
应用补丁
git apply test.patch
以上是关于Linux & Android生成和应用Patch文件的主要内容,如果未能解决你的问题,请参考以下文章