ZedBoard学习-Linux内核补丁知识整理篇
- UID
- 1023229
- 来自
- 中国
|
ZedBoard学习-Linux内核补丁知识整理篇
前两篇文章从两个角度找出了在为Linux内核打补丁文件patchname.patch不成功时的解决方案。简单补丁可从补丁角度入手也可从内核代码角度入手,复杂补丁则从补丁角度入手。这里就整理了一些关于Patch的知识贴出来以供了解。
Patch介绍:
Patch是什么。如果一个软件有了新版本,我们可以完整地下载新版本的代码进行编译安装。然而,像Linux Kernel这样的大型项目,代码即使压缩,也超过70MB,每次全新下载是有相当大的代价的。然而,每次更新变动的代码可能不超过1MB,因此,我们只 要能够有两个版本代码的diff的数据,应该就可以以极低的代价更新程序了。因此,Larry Wall开发了一个工具:patch。它可以根据一个diff文件进行版本更新。
UNIX世界的软件开发大多都是协作式的,因此,Patch(补丁)是一个相当重要的东西,因为几乎所有的大型UNIX项目的普通贡献者,都是通过 Patch来提交代码的。作为最重要的开源项目之一,Linux,也是这样的。普通开发者从软件仓库clone下代码,然后写入代码,做一个Patch, 最后用E-mail发给Linux Kernel的维护者就好了。Git最初作为Linux的版本控制工具,提供了透明、完整、稳定的Patch功能。
Git中的Patch方案:
在git中,我们没有必要直接使用diff和patch来做补丁,这样做既危险又麻烦。git提供了两种简单的patch方案。一是用git diff生成的标准patch,二是git format-patch生成的Git专用Patch。二者的区别就是专用Patch中除了文件内容差异外,还包含了作者信息和提交消息, 而且是个E-mail的文件,你可以直接发送它!对于传统的 diff 命令生成的补丁,则只能用 git apply 处理。二者的比较见下表
比较项目
| 标准Patch
| Git专用Patch
| 制作方式
| git diff
| git format-patch
| 补丁内容
| 文件内容差异
| 文件内容差异、作者信息、提交消息
| 应用方式
| git apply
| git apply、git am
| 可否直接发送
| 不可
| 是个E-mail的文件,可直接发送
|
应用补丁实例
如果收到的补丁文件是用 git diff 或由其它 Unix 的 diff 命令生成,就该用 git apply 命令来应用补丁。假设补丁文件存在 /tmp/patch-ruby-client.patch,可以这样运行:
$ git apply /tmp/patch-ruby-client.patch
这会修改当前工作目录下的文件,效果基本与运行 patch -p1 打补丁一样,但它更为严格,且不会出现混乱。如果是 git diff 格式描述的补丁,此命令还会相应地添加,删除,重命名文件。当然,普通的 patch 命令是不会这么做的。另外请注意,git apply 是一个事务性操作的命令,也就是说,要么所有补丁都打上去,要么全部放弃。所以不会出现 patch 命令那样,一部分文件打上了补丁而另一部分却没有,这样一种不上不下的修订状态。所以总的来说,git apply 要比 patch 严谨许多。因为仅仅是更新当前的文件,所以此命令不会自动生成提交对象,你得手工缓存相应文件的更新状态并执行提交命令。
在实际打补丁之前,可以先用 git apply --check 查看补丁是否能够干净顺利地应用到当前分支中:
$ git apply --check 0001-seeing-if-this-helps-the-gem.patch
error: patch failed: ticgit.gemspec:1
error: ticgit.gemspec: patch does not apply
如果没有任何输出,表示我们可以顺利采纳该补丁。如果有问题,除了报告错误信息之外,该命令还会返回一个非零的状态,所以在 shell 脚本里可用于检测状态。
来源:wicoboy的博客 |
|
|
|
|
|