生成patch的方法
1. 使用linux下的diff命令
1.为单个文件生成补丁
$ diff -up linux-2.6.28.8/net/sunrpc/svc.orig.c linux-2.6.28.8/net/sunrpc/svc.c > patch
-u 显示有差异行的前后几行(上下文), 默认是前后各3行, 这样, patch中带有更多的信息.
-p 显示代码所在的c函数的信息.
2.为多个文件生成补丁
$ diff -uprN linux-2.6.28.8.orig/net/sunrpc/ linux-2.6.28.8/net/sunrpc/
这条命令对比了linux-2.6.28.8.orig/net/sunrpc/和linux-2.6.28.8/net/sunrpc/两个目录下的所有源码差异.
参数详解:
-r 递归地对比一个目录和它的所有子目录(即整个目录树).
-N 如果某个文件缺少了, 就当作是空文件来对比. 如果不使用本选项, 当diff发现旧代码或者新代码缺少文件时, 只简单的提示缺少文件. 如果使用本选项, 会将新添加的文件全新打印出来作为新增的部分.
3 打patch
生成的补丁中, 路径信息包含了你的Linux源码根目录的名称, 但其他人的源码根目录可能是其它名字, 所以, 打补丁时, 要进入你的Linux源码根目录, 并且告诉patch工具, 请忽略补丁中的路径的第一级目录(参数-p1).
$ patch -p1 < patch1.diff
diff命令必须在整个Linux源码的根目录的上一级目录中执行.
【注】
p0表示当前路径,p1表示忽略第一个路径,例如 在 home/share路径下,执行patch,而patch是share/ubuntu/file/1.c 。p1表示忽略share目录。
如果用git diff生成的patch,使用patch打上时,有所不同,还需要做测试
4 示例
给修改过的内核生成patch,然后用生成的patch给未修改过的内核打补丁
其中,目录linux-2.6.31.3为未修改过的内核,目录linux-2.6.31.3_1为修改过的内核
$ diff -uparN linux-2.6.31.3 linux-2.6.31.3_1/ > mypatch$ cd linux-2.6.31.3$ patch -p1 < mypatch
【注】:
1. 用diff工具不能对两个独立的文件同时生成一个patch,例如: diff 1.c 2.c > file.diff
该命令会将2.c当作1.c的差异。
2. 已经打过的patch,用同样的命令,则会还原patch,若要严格指定打or还原patch
严格指定打patch
# patch -Np0 < foo.patch
严格指定还原patch
# patch -Rp0 < foo.patch
【2】 git 生成patch和使用patch
方式 1:
使用git diff命令
git diff > patch git diff --cached > patch git diff branchname --cached > patch
打patch
git apply patch
git apply 是一个事务性操作的命令,也就是说,要么所有补丁都打上去,要么全部放弃
用以下命令检查patch是否可以顺利打上
git apply --check <patch>
方式2
git format-patch 命令
1)两个节点之间的提交: git format-patch 节点A 节点B 2)单个节点: git format-patch -1 节点A (-n就表示要生成几个节点的提交) 3)最近一次提交节点的patch :git format-patch HEAD^ 依次类推…
使用git format-patch命令生成的patch文件,包含了提交的附加信息:比如作者,时间等
打patch
git am <PATCH>
再次基础上使用git am命令即可将此补丁应用到当前分支。注意应用完之后,你会发现当前分支多了一次提交记录,并且有完整的信息,而不是简单的修改文件。在对比一下,git diff 和git format-patch生成的patch一个重要不同之处,实际使用中会发现git diff一次只会生成一个patch文件,不管差别了多少个提交,都是一个;而git format-patch是根据提交的节点来的,一个节点一个patch。
补充小技巧: 如果有额外信息需要补充,但又不想放在提交消息中说明以免搞乱了提交说明。可以编辑这些补丁文件,在第一个“---” 行之前添加说明即可。这样的信息能阅读,但在执行完git am命令之后该节点的提交信息不回包含上述信息
本地代码与服务器代码有冲突,导致代码无法提交入库 使用git format-patch -1 (-1是指将上一笔,也可以-1 + commit id) 将提交做成patch。 使用git reset 将本地代码回退到之前的版本。 重新git pull到最新代码 使用git am + patch名 将之前提交重新合入,此时使用git log可以看到提交 repo upload .重新提交
参考:
git am PATCH 失败的处理方法
http://blog.csdn.net/sunnylgz/article/details/7660638
git 生成patch和使用patch
http://blog.csdn.net/maybe_windleave/article/details/8703778