如何往 Linux 内核社区提交代码

2018年12月1日 14.64k 次阅读 0 条评论 11 人点赞

目录

总有这样一群人,不计报酬不辞辛苦的为这个世界的美好添砖加瓦,在这一类人中的某一些人,他们开创了许多伟大的开源工程,这些工程也许会随着年代的久远逐渐被替代,但仍然有一些随着时光流逝变得愈发强大,这其中就包括了 Linux 内核工程。还有一群怀揣着梦想的人,总是提醒自己不断的变得强大,变得专业,所以依托于这些优秀的工程开始自己的探索之路,这其中刚好就包括你我。

不论你的 Java 写得多么的溜,C 语言技巧多么的花哨,当你决定加入这一场没有硝烟的与自己的战争,一切都会从 0 开始,那么我,教你如何开始。

编写优秀的代码只是开始

有时候你发现了一个 BUG,刚好这也是你的专业能够力所能及,那么请修复好他。这时候你需要用到一个同样伟大的工具 git,人和动物最大的区别就是人会使用工具,请用好它,并把他当做你的人生道路的阶梯。

当你 Fix 一个 BUG,现在开始需要制作一个 git 提交,在此之前首先准备好你的工具,好好打磨:

[root@localhost ~]# cat ~/.gitconfig
[user]
    email = liuyun01@kylinos.cn
    name = Jackie Liu

设置好你的姓名与邮箱,务必确保你的邮箱无误且是你常用邮箱,无论是什么工程都会通过邮件作为主要沟通方式。现在已经准备好了自己的信息,当你再次使用工具 git 时,他会知道你是谁,然后通过它再告诉世界你是谁。这很重要。

[root@localhost linux-stable]# git add Makefile && git commit -sm "update Makefile"

添加并 commit 这个信息到本地,Congratulation!你的 Patch 已经完成了本地提交,长征开始了。

补丁提取

补丁提交已经完成,要提交给上游可不是随便就可以,你我并没有权限可以直接 Push 到顶级源码树,需要你把它提取出来再邮件发送给子系统维护者,他们会替你提交给顶级源码树。有必要更多的强调一些流程,很多时候代码并不可能一次性就会被接纳,不要灰心,根据维护者的建议再修改一次,此时需要对你提取的补丁生成一个 Version,我来教你怎么做。

[root@localhost linux-stable]# git format-patch -3 -v2 --cover-letter -o patchs

简单解释一下,-3 代表需要生成 3 个当前的分支 HEAD 位置往下的补丁,-v2 代表这已经是第二次生成补丁了,需要注意这并不是你个人第二次提取补丁的意思,而是你前一次已经通过邮件发送到了邮件列表之后,被维护者提供建议之后的再一次修改提取补丁,这样提取的补丁会有 [PATCH v2] 的字样开头,以此类推,有时候遇到重大修改可能需要上十次。--cover-letter 就是的作用就是有时候你需要提交一系列的补丁,那么最好有个总结的文字再前面,而这个参数会生成一个 v1-0000-cover-letter.patch 的补丁,需要你自己修改名字以及它里面的内容,你需要尽可能的详细,让维护者正确理解你的代码所要表达的意思。-o patchs 就是将补丁全部出去到 patchs 目录,这样容易归纳处理。

保持好的代码格式

无规矩不成方圆,好的代码格式才会让审查者帮助你审查代码,他们都是子系统的 Maintainer,需要极高的水平且维护各子功能模块,没有统一的且优秀的代码格式是无法完成一个优秀系统的设计,正如 Linux 内核,据统计每年高达千人的对其进行修改,如果不统一代码格式,寸步难行。拿到刚刚提取的补丁,修改 cover-letter 这个补丁的信息,现在开始检查代码格式:

[root@localhost linux-stable]# ./script/cleanpatch 0001-update-makefile.patch

这个命令会完成一个基本的检查和修复,比如空格和 TAB 的一个替换等等(Linux 社区使用 TAB 缩进),完成这一部分基本操作之后,再开始正式的代码检查:

[root@localhost linux-stable]# ./scripts/checkpatch.pl v1-0036-hisi-pci-hisi-add-fix_hisi_hp_device-check.patch
ERROR: do not initialise globals to NULL
#25: FILE: drivers/pci/quirks.c:336:
+fix_hisi_fn fix_hisi_hp_device = NULL;

total: 1 errors, 0 warnings, 17 lines checked

v1-0036-hisi-pci-hisi-add-fix_hisi_hp_device-check.patch has style problems, please review.

NOTE: If any of the errors are false positives, please report
      them to the maintainer, see CHECKPATCH in MAINTAINERS.

你会看到很多类似的信息,你需要一行行的修复,一个 Error 都不允许存在,最好就是连 Warnning 也不要有。

发送吧

当你准备好这一切关于源码的部分,那么现在就将他发给维护者吧,提交前请三思,是不是都准备好了,而且是不是代码不存在明显的问题?如果可以,开始吧:

[root@localhost linux-stable]# cat  ~/.gitconfig
[sendemail]
    smtpencryption = ssl
    smtpuser = liuyun01@kylinos.cn
    smtpserverport = 465
    smtpserver = smtp.exmail.qq.com
    smtppass = xxxxxx

[user]
    name = Jackie Liu
    email = liuyun01@kylinos.cn

添加上你的邮箱 SMTP,通过自己邮箱来发送这些补丁是有必要的,当你设置好邮箱并自我测试通过之后。开始执行最后的发送命令。

[root@localhost linux-stable]# git send-email --to xxx.kernel.org -cc xxx.vger.kernel.org patchs

--to 就是主要的 Maintainer 的邮箱,--cc 就是邮件列表,至于谁是这个子系统的 Maintainer,可以通过一个脚本来获取,邮件列表是什么的话,来这里查找内核邮件列表的 List吧:

[root@localhost linux-stable]# ./scripts/get_maintainer.pl Makefile -f

其实就是通过 get_maintainer.pl 加目录名或者文件名来查找维护者或者邮件列表,很简单。

其他问题

目前我自己遇到过 2 个问题,一个是发送的邮箱存在被邮件列表 Ban 掉的问题,就是所有这个邮箱往外发布的补丁都会被邮件列表拒绝,这个我和 IO 子系统的维护者聊过,问过他有没有什么办法,他也替我咨询了一下做邮件列表的人,最后得出的结论就是由于代理我这个邮箱的服务器存在往邮件列表灌输垃圾邮件的原因,导致邮件列表服务器把所有的来自改服务器的邮件都拒绝了,所以这个问题无解,幸好我是有其他邮箱可以发送补丁的,如果你也存在这样的问题,但是碰巧又是长期从事内核开发且已经发送过不少补丁的内核开发者,你可以发邮件到社区申请开通一个 Linux.dev 的邮箱,我现在一直用的这个,如果你搞不到这种邮箱,那么建议你自己申请一下 126 或者 163 邮箱发送补丁,只要 format-patch 的时候保留自己的 From: Jackie Liu liuyun01@kylinos.cn 这样的字段,对方接收到补丁之后,作者还会是你写的这个 From 的邮箱,这样可以记录为公司贡献。我不建议大家使用 qq 邮箱,因为 qq 邮箱好像也被邮件列表 Ban 掉了,不信的话,可以试试,如果可以那你就继续使用。第二个问题就是不要用 gmail 邮箱,我严重怀疑是 Google 使的坏,如果你的补丁通过 Gmail 发送的话,你的 From 字段会被删除,如果补丁被应用的话,author 会是你的 Gmail 邮箱地址,虽然我没有去问过 Gmail 邮箱的人,但是身边一些用 Gmail 邮箱发送补丁然后被合并的,都是这样的问题,如果是利用公司邮箱贡献的话,请不要用 Gmail,老老实实用 163 邮箱吧。

标签:
最后编辑:2022年5月26日