中年如何高效阅读代码?Linux大神拍了拍你并教给你这三个步骤( 六 )
举个具体的例子 , 假设当前目录下有两个子目录linux-4.4.1和linux-4.4.2 , 分别是Linux-4.4.1版本和Linux-4.4.2版本的源代码顶级目录 。 那么可以用diff命令来执行公式1的过程 , 导出一个变更集(即源代码差异)到补丁文件kernel.patch:
diff -Naurp linux-4.4.1 linux-4.4.2 > kernel.patch
接下来可以先进入linux-4.4.1目录 , 用patch命令来执行公式2的过程 , 通过应用补丁文件kernel.patch将Linux-4.4.1的源代码状态变成跟Linux-4.4.2一致:
patch -p1 < kernel.patch
上面是对补丁文件的正向应用 , 使源代码状态A变成源代码状态B 。 实际上补丁文件还可以反向应用 , 使源代码状态从B变成源代码状态A 。 比如先进入linux-4.4.2目录 , 然后通过反向应用补丁文件kernel.patch将Linux-4.4.2的源代码状态变成跟Linux-4.4.1一致:
patch -Rp1 < kernel.patch
利用两个目录来保存两个版本的内核源代码 , 使用diff和patch命令来操作补丁文件的做法是一种非常原始的方法 。 通常在内核开发中我们推荐使用Git做版本管理工具 。 Git可以记录源代码变化的版本历史 , 可以回滚到任意一个历史状态 , 也可以导出两个版本之间的变更集(即源代码差异) 。
图1是一个Git历史记录的示例(用git log命令查看) 。
本文插图
图1 Linux内核源代码的Git历史记录示例
图中用节点和线条来描述历史演进关系 , 每个节点是代表一个完整的源代码状态(即某一个版本的完整源代码) 。 在Git的术语里面一个版本节点称之为一个commit , 用一个40位十六进制数的哈希值来表达 。 Git里面有分支的概念 , 历史记录是允许分叉合并的 , 也就是说可以有多条历史线同时演进 。
在Git里面我们有更先进的方法导出和应用补丁文件(commit1和commit2代表两次commit的散列值 , 散列值也叫哈希值 , 即Hash的音译):
导出补丁(公式1):git diff commit1 commit2 > kernel.patch
应用补丁(公式2):git apply kernel.patch
这两个git命令导出和应用的补丁称之为简单格式补丁 , 它与diff/patch命令所操作的补丁具有相同的格式 。 但git还可以操作更加强大的正规格式补丁(commit1和commit2代表两次commit的散列值):
导出补丁(公式1):git format-patch commit1..commit2 -o kernel_patch_dir
应用补丁(公式2):git am kernel_patch_dir/*.patch
这两个命令中 , 如果commit1和commit2相邻 , 就会导出一个补丁;如果不相邻 , 就会导出一系列补丁 。 这些补丁保存在目录kernel_patch_dir中 , 按版本从早到晚(从旧到新)的顺序 , 以0001-xxx-yyy.patch , 0002-xxx-yyy.patch的格式逐个命名 。 正规格式补丁导出以后可以直接以电子邮件的形式发送出去 , 而应用正规格式补丁的同时会自动提交到代码库 。 图2是一个正规格式补丁的具体示例 。
本文插图
图2 一个正规格式的补丁文件内容
一个正规格式的补丁内容包括4大部分:头部信息、描述信息、正文区和脚注区 。 图2中补丁的头部信息指的是前4行 , 包含了作为电子邮件的Commit编号、发送人、补丁日期和邮件标题(邮件标题同时也是Commit标题) 。 描述信息指的是图中第一个空白行以后 , 第一个分割线之前的部分 , 包括补丁内容描述(补丁内容描述同时也是Commit描述)和作者签名(Signed-of-by开头的两行 , 如有必要还可以加上审查者签名Reviewed-by、确认者签名Acked-by、报告者签名Reported-by、测试者签名Tested-by等) 。 接下来从第一个分割线开始到最后一个分割线之前的部分都是正文区 , 这是最重要的一部分 , 即补丁的主体部分(简单格式补丁只有正文部分) 。 最后的脚注区就是git的版本号标识 。
推荐阅读
- 湖人队|扎心?一张图看湖人如何应对马赛克三分雨,神龟5米范围没人理他
- 搜狐新闻|准大学生数码三件套如何选?这些元气好物值得种草
- 想好好做医生的胖子|五十岁女性经常有周身无力和疼痛的困扰!该如何应对?医生告诉您
- 儿童饮食|秋冬季如何让宝宝爱上吃水果?稍微蒸一下美味翻倍,营养价值更高
- 队员|北极科考中“遭遇”北极熊,看科考队员如何与它们和谐相处
- 中国历史发展过程|中国历史发展过程!中国游戏外挂发展史:“辅助工具”是如何成长为“苍
- 金色年华录|都是男扮女装谈恋爱,《少女大人》比《女世子》如何?
- 上海市嘉定区人民政府网站|每年消耗3350吨蔬菜150吨肉,嘉定这家中央厨房如何践行“光盘行动”?
- 上海嘉定|如何让《民法典》走进群众心里?嘉定这些街镇和单位这样做
- 没蜡笔的小新|“整容脸”应该被鄙视吗?医生告诉你千篇一律的好看皮囊如何而来
