162306a36Sopenharmony_ci.. SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci.. include:: ../disclaimer-zh_CN.rst
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci.. _cn_submittingpatches:
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci:Original: Documentation/process/submitting-patches.rst
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci:译者:
1062306a36Sopenharmony_ci - 钟宇 TripleX Chung <xxx.phy@gmail.com>
1162306a36Sopenharmony_ci - 时奎亮 Alex Shi <alexs@kernel.org>
1262306a36Sopenharmony_ci - 吴想成 Wu XiangCheng <bobwxc@email.cn>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci:校译:
1562306a36Sopenharmony_ci - 李阳 Li Yang <leoyang.li@nxp.com>
1662306a36Sopenharmony_ci - 王聪 Wang Cong <xiyou.wangcong@gmail.com>
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci提交补丁:如何让你的改动进入内核
2062306a36Sopenharmony_ci================================
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci对于想要将改动提交到 Linux 内核的个人或者公司来说,如果不熟悉“规矩”,
2362306a36Sopenharmony_ci提交的流程会让人畏惧。本文档包含了一系列建议,可以大大提高你
2462306a36Sopenharmony_ci的改动被接受的机会.
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci本文档以较为简洁的行文给出了大量建议。关于内核开发流程如何进行的详细信息,
2762306a36Sopenharmony_ci参见: Documentation/translations/zh_CN/process/development-process.rst2862306a36Sopenharmony_ciDocumentation/translations/zh_CN/process/submit-checklist.rst 给出了一系列
2962306a36Sopenharmony_ci提交补丁之前要检查的事项。设备树相关的补丁,请参阅
3062306a36Sopenharmony_ciDocumentation/devicetree/bindings/submitting-patches.rst3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci本文档假设您正在使用 ``git`` 准备你的补丁。如果您不熟悉 ``git`` ,最好学习
3362306a36Sopenharmony_ci如何使用它,这将使您作为内核开发人员的生活变得更加轻松。
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci部分子系统和维护人员的树有一些关于其工作流程和要求的额外信息,请参阅
3662306a36Sopenharmony_ciDocumentation/process/maintainer-handbooks.rst3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci获取当前源码树
3962306a36Sopenharmony_ci--------------
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci如果您手头没有当前内核源代码的存储库,请使用 ``git`` 获取一份。您需要先获取
4262306a36Sopenharmony_ci主线存储库,它可以通过以下命令拉取::
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci    git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci但是,请注意,您可能不想直接针对主线树进行开发。大多数子系统维护人员运
4762306a36Sopenharmony_ci行自己的树,并希望看到针对这些树准备的补丁。请参见MAINTAINERS文件中子系
4862306a36Sopenharmony_ci统的 **T:** 项以查找该树,或者直接询问维护者该树是否未在其中列出。
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci.. _zh_describe_changes:
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci描述你的改动
5362306a36Sopenharmony_ci------------
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci描述你的问题。无论您的补丁是一行错误修复还是5000行新功能,都必须有一个潜在
5662306a36Sopenharmony_ci的问题激励您完成这项工作。说服审阅者相信有一个问题值得解决,让他们读完第一段
5762306a36Sopenharmony_ci后就能明白这一点。
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci描述用户可见的影响。直接崩溃和锁定是相当有说服力的,但并不是所有的错误都那么
6062306a36Sopenharmony_ci明目张胆。即使在代码审阅期间发现了这个问题,也要描述一下您认为它可能对用户产
6162306a36Sopenharmony_ci生的影响。请记住,大多数Linux安装运行的内核来自二级稳定树或特定于供应商/产品
6262306a36Sopenharmony_ci的树,只从上游精选特定的补丁,因此请包含任何可以帮助您将更改定位到下游的内容:
6362306a36Sopenharmony_ci触发的场景、DMESG的摘录、崩溃描述、性能回归、延迟尖峰、锁定等。
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci质量优化和权衡。如果您声称在性能、内存消耗、堆栈占用空间或二进制大小方面有所
6662306a36Sopenharmony_ci改进,请包括支持它们的数据。但也要描述不明显的成本。优化通常不是零成本的,而是
6762306a36Sopenharmony_ci在CPU、内存和可读性之间进行权衡;或者,做探索性的工作,在不同的工作负载之间进
6862306a36Sopenharmony_ci行权衡。请描述优化的预期缺点,以便审阅者可以权衡成本和收益。
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci提出问题之后,就要详细地描述一下您实际在做的技术细节。对于审阅者来说,用简练的
7162306a36Sopenharmony_ci英语描述代码的变化是很重要的,以验证代码的行为是否符合您的意图。
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci如果您将补丁描述写成“标准格式”,可以很容易地作为“提交日志”放入Linux的源代
7462306a36Sopenharmony_ci码管理系统 ``git`` 中,那么维护人员将非常感谢您。
7562306a36Sopenharmony_ci参见 :ref:`zh_the_canonical_patch_format` 。
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci每个补丁只解决一个问题。如果你的描述开始变长,这就表明你可能需要拆分你的补丁。
7862306a36Sopenharmony_ci请见 :ref:`zh_split_changes` 。
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci提交或重新提交补丁或补丁系列时,请包括完整的补丁说明和理由。不要
8162306a36Sopenharmony_ci只说这是补丁(系列)的第几版。不要期望子系统维护人员引用更早的补丁版本或引用
8262306a36Sopenharmony_ciURL来查找补丁描述并将其放入补丁中。也就是说,补丁(系列)及其描述应该是独立的。
8362306a36Sopenharmony_ci这对维护人员和审阅者都有好处。一些审阅者可能甚至没有收到补丁的早期版本。
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci用祈使句描述你的变更,例如“make xyzzy do frotz”而不是“[This patch]make
8662306a36Sopenharmony_cixyzzy do frotz”或“[I]changed xyzzy to do frotz”,就好像你在命令代码库改变
8762306a36Sopenharmony_ci它的行为一样。
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci如果您想要引用一个特定的提交,不要只引用提交的SHA-1 ID。还请包括提交的一行
9062306a36Sopenharmony_ci摘要,以便于审阅者了解它是关于什么的。例如::
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci        Commit e21d2170f36602ae2708 ("video: remove unnecessary
9362306a36Sopenharmony_ci        platform_set_drvdata()") removed the unnecessary
9462306a36Sopenharmony_ci        platform_set_drvdata(), but left the variable "dev" unused,
9562306a36Sopenharmony_ci        delete it.
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci您还应该确保至少使用前12位SHA-1 ID。内核存储库包含 *许多* 对象,使较短的ID
9862306a36Sopenharmony_ci发生冲突的可能性很大。记住,即使现在不会与您的六个字符ID发生冲突,这种情况
9962306a36Sopenharmony_ci也可能在五年后改变。
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci如果该变更的相关讨论或背景信息可以在网上查阅,请加上“Link:”标签指向它。例如
10262306a36Sopenharmony_ci你的补丁修复了一个缺陷,需要添加一个带有URL的标签指向邮件列表存档或缺陷跟踪器
10362306a36Sopenharmony_ci的相关报告;如果该补丁是由一些早先邮件列表讨论或网络上的记录引起的,请指向它。
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci当链接到邮件列表存档时,请首选lore.kernel.org邮件存档服务。用邮件中的
10662306a36Sopenharmony_ci``Message-ID`` 头(去掉尖括号)可以创建链接URL。例如::
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci    Link: https://lore.kernel.org/r/30th.anniversary.repost@klaava.Helsinki.FI/
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci请检查该链接以确保可用且指向正确的邮件。
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci不过,在没有外部资源的情况下,也要尽量让你的解释可理解。除了提供邮件列表存档或
11362306a36Sopenharmony_ci缺陷的URL之外,还要需要总结该补丁的相关讨论要点。
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci如果补丁修复了特定提交中的错误,例如使用 ``git bisct`` 发现了一个问题,请使用
11662306a36Sopenharmony_ci带有前12个字符SHA-1 ID的“Fixes:”标签和单行摘要。为了简化解析脚本,不要将该
11762306a36Sopenharmony_ci标签拆分为多行,标签不受“75列换行”规则的限制。例如::
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci  Fixes: 54a4f0239f2e ("KVM: MMU: make kvm_mmu_zap_page() return the number of pages it actually freed")
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_ci下列 ``git config`` 设置可以让 ``git log``, ``git show`` 增加上述风格的显示格式::
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci	[core]
12462306a36Sopenharmony_ci		abbrev = 12
12562306a36Sopenharmony_ci	[pretty]
12662306a36Sopenharmony_ci		fixes = Fixes: %h (\"%s\")
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_ci使用示例::
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_ci	$ git log -1 --pretty=fixes 54a4f0239f2e
13162306a36Sopenharmony_ci	Fixes: 54a4f0239f2e ("KVM: MMU: make kvm_mmu_zap_page() return the number of pages it actually freed")
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ci.. _zh_split_changes:
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_ci拆分你的改动
13662306a36Sopenharmony_ci------------
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ci将每个 **逻辑更改** 拆分成一个单独的补丁。
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_ci例如,如果你的改动里同时有bug修正和性能优化,那么把这些改动拆分到两个或
14162306a36Sopenharmony_ci者更多的补丁文件中。如果你的改动包含对API的修改,并且增加了一个使用该新API
14262306a36Sopenharmony_ci的驱动,那么把这些修改分成两个补丁。
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_ci另一方面,如果你将一个单独的改动做成多个补丁文件,那么将它们合并成一个
14562306a36Sopenharmony_ci单独的补丁文件。这样一个逻辑上单独的改动只被包含在一个补丁文件里。
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_ci需要记住的一点是,每个补丁的更改都应易于理解,以便审阅者验证。每个补丁都应该
14862306a36Sopenharmony_ci对其价值进行阐述。
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_ci如果有一个补丁依赖另外一个补丁来完成它的改动,那没问题。直接在你的补
15162306a36Sopenharmony_ci丁描述里指出 **“这个补丁依赖某补丁”** 就好了。
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ci在将您的更改划分为一系列补丁时,要特别注意确保内核在应用系列中的每个补丁之后
15462306a36Sopenharmony_ci都能正常构建和运行。使用 ``git bisect`` 来追踪问题的开发者可能会在任何地方分
15562306a36Sopenharmony_ci割你的补丁系列;如果你在中间引入错误,他们不会感谢你。
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_ci如果你不能将补丁系列浓缩得更小,那么每次大约发送出15个补丁,然后等待审阅
15862306a36Sopenharmony_ci和集成。
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_ci检查你的更改风格
16162306a36Sopenharmony_ci----------------
16262306a36Sopenharmony_ci
16362306a36Sopenharmony_ci检查您的补丁是否违反了基本样式规定,详细信息参见
16462306a36Sopenharmony_ciDocumentation/translations/zh_CN/process/coding-style.rst
16562306a36Sopenharmony_ci中找到。如果不这样做,只会浪费审阅者的时间,并且会导致你的补丁被拒绝,甚至
16662306a36Sopenharmony_ci可能没有被阅读。
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_ci一个重要的例外是在将代码从一个文件移动到另一个文件时——在这种情况下,您不应
16962306a36Sopenharmony_ci该在移动代码的同一个补丁中修改移动的代码。这清楚地描述了移动代码和您的更改
17062306a36Sopenharmony_ci的行为。这大大有助于审阅实际差异,并允许工具更好地跟踪代码本身的历史。
17162306a36Sopenharmony_ci
17262306a36Sopenharmony_ci在提交之前,使用补丁样式检查程序检查补丁(scripts/check patch.pl)。不过,
17362306a36Sopenharmony_ci请注意,样式检查程序应该被视为一个指南,而不是作为人类判断的替代品。如果您
17462306a36Sopenharmony_ci的代码看起来更好,但有违规行为,那么最好别管它。
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_ci检查者报告三个级别:
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_ci - ERROR:很可能出错的事情
17962306a36Sopenharmony_ci - WARNING:需要仔细审阅的事项
18062306a36Sopenharmony_ci - CHECK:需要思考的事情
18162306a36Sopenharmony_ci
18262306a36Sopenharmony_ci您应该能够判断您的补丁中存在的所有违规行为。
18362306a36Sopenharmony_ci
18462306a36Sopenharmony_ci选择补丁收件人
18562306a36Sopenharmony_ci--------------
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_ci您应该总是知会任何补丁相应代码的子系统维护人员;查看
18862306a36Sopenharmony_ci维护人员文件和源代码修订历史记录,以了解这些维护人员是谁。脚本
18962306a36Sopenharmony_ciscripts/get_maintainer.pl在这个步骤中非常有用。如果您找不到正在工作的子系统
19062306a36Sopenharmony_ci的维护人员,那么Andrew Morton(akpm@linux-foundation.org)将充当最后的维护
19162306a36Sopenharmony_ci人员。
19262306a36Sopenharmony_ci
19362306a36Sopenharmony_ci您通常还应该选择至少一个邮件列表来接收补丁集的副本。linux-kernel@vger.kernel.org
19462306a36Sopenharmony_ci是所有补丁的默认列表,但是这个列表的流量已经导致了许多开发人员不再看它。
19562306a36Sopenharmony_ci在MAINTAINERS文件中查找子系统特定的列表;您的补丁可能会在那里得到更多的关注。
19662306a36Sopenharmony_ci不过,请不要发送垃圾邮件到无关的列表。
19762306a36Sopenharmony_ci
19862306a36Sopenharmony_ci许多与内核相关的列表托管在vger.kernel.org上;您可以在
19962306a36Sopenharmony_cihttp://vger.kernel.org/vger-lists.html 上找到它们的列表。不过,也有与内核相关
20062306a36Sopenharmony_ci的列表托管在其他地方。
20162306a36Sopenharmony_ci
20262306a36Sopenharmony_ci不要一次发送超过15个补丁到vger邮件列表!!!!
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_ciLinus Torvalds是决定改动能否进入 Linux 内核的最终裁决者。他的邮件地址是
20562306a36Sopenharmony_citorvalds@linux-foundation.org 。他收到的邮件很多,所以一般来说最好 **别**
20662306a36Sopenharmony_ci给他发邮件。
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_ci如果您有修复可利用安全漏洞的补丁,请将该补丁发送到 security@kernel.org 。对于
20962306a36Sopenharmony_ci严重的bug,可以考虑短期禁令以允许分销商(有时间)向用户发布补丁;在这种情况下,
21062306a36Sopenharmony_ci显然不应将补丁发送到任何公共列表。
21162306a36Sopenharmony_ci参见 Documentation/translations/zh_CN/admin-guide/security-bugs.rst21262306a36Sopenharmony_ci
21362306a36Sopenharmony_ci修复已发布内核中严重错误的补丁程序应该抄送给稳定版维护人员,方法是把以下列行
21462306a36Sopenharmony_ci放进补丁的签准区(注意,不是电子邮件收件人)::
21562306a36Sopenharmony_ci
21662306a36Sopenharmony_ci  Cc: stable@vger.kernel.org
21762306a36Sopenharmony_ci
21862306a36Sopenharmony_ci除了本文件之外,您还应该阅读
21962306a36Sopenharmony_ciDocumentation/translations/zh_CN/process/stable-kernel-rules.rst22062306a36Sopenharmony_ci
22162306a36Sopenharmony_ci如果更改影响到用户侧内核接口,请向手册页维护人员(如维护人员文件中所列)发送
22262306a36Sopenharmony_ci手册页补丁,或至少发送更改通知,以便一些信息进入手册页。还应将用户空间API
22362306a36Sopenharmony_ci更改抄送到 linux-api@vger.kernel.org 。
22462306a36Sopenharmony_ci
22562306a36Sopenharmony_ci
22662306a36Sopenharmony_ci不要MIME编码,不要链接,不要压缩,不要附件,只要纯文本
22762306a36Sopenharmony_ci------------------------------------------------------
22862306a36Sopenharmony_ci
22962306a36Sopenharmony_ciLinus 和其他的内核开发者需要阅读和评论你提交的改动。对于内核开发者来说
23062306a36Sopenharmony_ci,可以“引用”你的改动很重要,使用一般的邮件工具,他们就可以在你的
23162306a36Sopenharmony_ci代码的任何位置添加评论。
23262306a36Sopenharmony_ci
23362306a36Sopenharmony_ci因为这个原因,所有的提交的补丁都是邮件中“内嵌”的。最简单(和推荐)的方法就
23462306a36Sopenharmony_ci是使用 ``git send-email`` 。https://git-send-email.io 有 ``git send-email``
23562306a36Sopenharmony_ci的交互式教程。
23662306a36Sopenharmony_ci
23762306a36Sopenharmony_ci如果你选择不用 ``git send-email`` :
23862306a36Sopenharmony_ci
23962306a36Sopenharmony_ci.. warning::
24062306a36Sopenharmony_ci
24162306a36Sopenharmony_ci  如果你使用剪切-粘贴你的补丁,小心你的编辑器的自动换行功能破坏你的补丁
24262306a36Sopenharmony_ci
24362306a36Sopenharmony_ci不要将补丁作为MIME编码的附件,不管是否压缩。很多流行的邮件软件不
24462306a36Sopenharmony_ci是任何时候都将MIME编码的附件当作纯文本发送的,这会使得别人无法在你的
24562306a36Sopenharmony_ci代码中加评论。另外,MIME编码的附件会让Linus多花一点时间来处理,这就
24662306a36Sopenharmony_ci降低了你的改动被接受的可能性。
24762306a36Sopenharmony_ci
24862306a36Sopenharmony_ci例外:如果你的邮路损坏了补丁,那么有人可能会要求你使用MIME重新发送补丁。
24962306a36Sopenharmony_ci
25062306a36Sopenharmony_ci请参阅 Documentation/translations/zh_CN/process/email-clients.rst
25162306a36Sopenharmony_ci以获取有关配置电子邮件客户端以使其不受影响地发送补丁的提示。
25262306a36Sopenharmony_ci
25362306a36Sopenharmony_ci回复审阅意见
25462306a36Sopenharmony_ci------------
25562306a36Sopenharmony_ci
25662306a36Sopenharmony_ci你的补丁几乎肯定会得到审阅者对补丁改进方法的评论(以回复邮件的形式)。您必须
25762306a36Sopenharmony_ci对这些评论作出回应;让补丁被忽略的一个好办法就是忽略审阅者的意见。直接回复邮
25862306a36Sopenharmony_ci件来回应意见即可。不会导致代码更改的意见或问题几乎肯定会带来注释或变更日志的
25962306a36Sopenharmony_ci改变,以便下一个审阅者更好地了解正在发生的事情。
26062306a36Sopenharmony_ci
26162306a36Sopenharmony_ci一定要告诉审阅者你在做什么改变,并感谢他们的时间。代码审阅是一个累人且耗时的
26262306a36Sopenharmony_ci过程,审阅者有时会变得暴躁。即使在这种情况下,也要礼貌地回应并解决他们指出的
26362306a36Sopenharmony_ci问题。当发送下一版时,在封面邮件或独立补丁里加上 ``patch changelog`` 说明与
26462306a36Sopenharmony_ci前一版本的不同之处(参见 :ref:`zh_the_canonical_patch_format` )。
26562306a36Sopenharmony_ci
26662306a36Sopenharmony_ci.. _zh_resend_reminders:
26762306a36Sopenharmony_ci
26862306a36Sopenharmony_ci不要泄气或不耐烦
26962306a36Sopenharmony_ci----------------
27062306a36Sopenharmony_ci
27162306a36Sopenharmony_ci提交更改后,请耐心等待。审阅者是大忙人,可能无法立即审阅您的补丁。
27262306a36Sopenharmony_ci
27362306a36Sopenharmony_ci曾几何时,补丁曾在没收到评论的情况下消失在虚空中,但现在开发过程应该更加顺利了。
27462306a36Sopenharmony_ci您应该在一周左右的时间内收到评论;如果没有收到评论,请确保您已将补丁发送
27562306a36Sopenharmony_ci到正确的位置。在重新提交或联系审阅者之前至少等待一周——在诸如合并窗口之类的
27662306a36Sopenharmony_ci繁忙时间可能更长。
27762306a36Sopenharmony_ci
27862306a36Sopenharmony_ci在等了几个星期后,用带RESEND的主题重发补丁也是可以的::
27962306a36Sopenharmony_ci
28062306a36Sopenharmony_ci   [PATCH Vx RESEND] sub/sys: Condensed patch summary
28162306a36Sopenharmony_ci
28262306a36Sopenharmony_ci当你发布补丁(系列)修改版的时候,不要加上“RESEND”——“RESEND”只适用于重
28362306a36Sopenharmony_ci新提交之前未经修改的补丁(系列)。
28462306a36Sopenharmony_ci
28562306a36Sopenharmony_ci主题中包含 PATCH
28662306a36Sopenharmony_ci----------------
28762306a36Sopenharmony_ci
28862306a36Sopenharmony_ci由于到Linus和linux-kernel的电子邮件流量很高,通常会在主题行前面加上[PATCH]
28962306a36Sopenharmony_ci前缀。这使Linus和其他内核开发人员更容易将补丁与其他电子邮件讨论区分开。
29062306a36Sopenharmony_ci
29162306a36Sopenharmony_ci``git send-email`` 会自动为你加上。
29262306a36Sopenharmony_ci
29362306a36Sopenharmony_ci签署你的作品——开发者来源认证
29462306a36Sopenharmony_ci------------------------------
29562306a36Sopenharmony_ci
29662306a36Sopenharmony_ci为了加强对谁做了何事的追踪,尤其是对那些透过好几层维护者才最终到达的补丁,我
29762306a36Sopenharmony_ci们在通过邮件发送的补丁上引入了“签署(sign-off)”流程。
29862306a36Sopenharmony_ci
29962306a36Sopenharmony_ci“签署”是在补丁注释最后的一行简单文字,认证你编写了它或者其他
30062306a36Sopenharmony_ci人有权力将它作为开放源代码的补丁传递。规则很简单:如果你能认证如下信息:
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_ci开发者来源认证 1.1
30362306a36Sopenharmony_ci^^^^^^^^^^^^^^^^^^
30462306a36Sopenharmony_ci
30562306a36Sopenharmony_ci对于本项目的贡献,我认证如下信息:
30662306a36Sopenharmony_ci
30762306a36Sopenharmony_ci       (a) 这些贡献是完全或者部分的由我创建,我有权利以文件中指出
30862306a36Sopenharmony_ci           的开放源代码许可证提交它;或者
30962306a36Sopenharmony_ci
31062306a36Sopenharmony_ci       (b) 这些贡献基于以前的工作,据我所知,这些以前的工作受恰当的开放
31162306a36Sopenharmony_ci           源代码许可证保护,而且,根据文件中指出的许可证,我有权提交修改后的贡献,
31262306a36Sopenharmony_ci           无论是完全还是部分由我创造,这些贡献都使用同一个开放源代码许可证
31362306a36Sopenharmony_ci           (除非我被允许用其它的许可证);或者
31462306a36Sopenharmony_ci
31562306a36Sopenharmony_ci       (c) 这些贡献由认证(a),(b)或者(c)的人直接提供给我,而
31662306a36Sopenharmony_ci           且我没有修改它。
31762306a36Sopenharmony_ci
31862306a36Sopenharmony_ci       (d) 我理解并同意这个项目和贡献是公开的,贡献的记录(包括我
31962306a36Sopenharmony_ci           一起提交的个人记录,包括sign-off)被永久维护并且可以和这个项目
32062306a36Sopenharmony_ci           或者开放源代码的许可证同步地再发行。
32162306a36Sopenharmony_ci
32262306a36Sopenharmony_ci那么加入这样一行::
32362306a36Sopenharmony_ci
32462306a36Sopenharmony_ci  Signed-off-by: Random J Developer <random@developer.example.org>
32562306a36Sopenharmony_ci
32662306a36Sopenharmony_ci使用你的真名(抱歉,不能使用假名或者匿名。)如果使用 ``git commit -s`` 的话
32762306a36Sopenharmony_ci将会自动完成。撤销也应当包含“Signed-off-by”, ``git revert -s`` 会帮你搞定。
32862306a36Sopenharmony_ci
32962306a36Sopenharmony_ci有些人会在最后加上额外的标签。现在这些东西会被忽略,但是你可以这样做,来标记
33062306a36Sopenharmony_ci公司内部的过程,或者只是指出关于签署的一些特殊细节。
33162306a36Sopenharmony_ci
33262306a36Sopenharmony_ci作者签署之后的任何其他签署(Signed-off-by:'s)均来自处理和传递补丁的人员,但
33362306a36Sopenharmony_ci未参与其开发。签署链应当反映补丁传播到维护者并最终传播到Linus所经过的 **真实**
33462306a36Sopenharmony_ci路径,首个签署指明单个作者的主要作者身份。
33562306a36Sopenharmony_ci
33662306a36Sopenharmony_ci何时使用Acked-by:,CC:,和Co-Developed by:
33762306a36Sopenharmony_ci------------------------------------------
33862306a36Sopenharmony_ci
33962306a36Sopenharmony_ciSinged-off-by: 标签表示签名者参与了补丁的开发,或者他/她在补丁的传递路径中。
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_ci如果一个人没有直接参与补丁的准备或处理,但希望表示并记录他们对补丁的批准/赞成,
34262306a36Sopenharmony_ci那么他们可以要求在补丁的变更日志中添加一个Acked-by:。
34362306a36Sopenharmony_ci
34462306a36Sopenharmony_ciAcked-by: 通常由受影响代码的维护者使用,当该维护者既没有贡献也没有转发补丁时。
34562306a36Sopenharmony_ci
34662306a36Sopenharmony_ciAcked-by: 不像签署那样正式。这是一个记录,确认人至少审阅了补丁,并表示接受。
34762306a36Sopenharmony_ci因此,补丁合并有时会手动将Acker的“Yep,looks good to me”转换为 Acked-By:(但
34862306a36Sopenharmony_ci请注意,通常最好要求一个明确的Ack)。
34962306a36Sopenharmony_ci
35062306a36Sopenharmony_ciAcked-by:不一定表示对整个补丁的确认。例如,如果一个补丁影响多个子系统,并且
35162306a36Sopenharmony_ci有一个来自某个子系统维护者的Acked-By:,那么这通常表示只确认影响维护者代码的部
35262306a36Sopenharmony_ci分。这里应该仔细判断。如有疑问,应参考邮件列表存档中的原始讨论。
35362306a36Sopenharmony_ci
35462306a36Sopenharmony_ci如果某人本应有机会对补丁进行评论,但没有提供此类评论,您可以选择在补丁中添加
35562306a36Sopenharmony_ci``Cc:`` 这是唯一可以在没有被该人明确同意的情况下添加的标签——但它应该表明
35662306a36Sopenharmony_ci这个人是在补丁上抄送的。此标签记录了讨论中包含的潜在利益相关方。
35762306a36Sopenharmony_ci
35862306a36Sopenharmony_ciCo-developed-by: 声明补丁是由多个开发人员共同创建的;当几个人在一个补丁上工
35962306a36Sopenharmony_ci作时,它用于给出共同作者(除了From:所给出的作者之外)。因为Co-developed-by:
36062306a36Sopenharmony_ci表示作者身份,所以每个Co-developed-by:必须紧跟在相关合作作者的签署之后。标准
36162306a36Sopenharmony_ci签署程序要求Singed-off-by:标签的顺序应尽可能反映补丁的时间历史,无论作者是通
36262306a36Sopenharmony_ci过From:还是Co-developed-by:表明。值得注意的是,最后一个Singed-off-by:必须是
36362306a36Sopenharmony_ci提交补丁的开发人员。
36462306a36Sopenharmony_ci
36562306a36Sopenharmony_ci注意,如果From:作者也是电子邮件标题的From:行中列出的人,则From:标签是可选的。
36662306a36Sopenharmony_ci
36762306a36Sopenharmony_ci被From:作者提交的补丁示例::
36862306a36Sopenharmony_ci
36962306a36Sopenharmony_ci	<changelog>
37062306a36Sopenharmony_ci
37162306a36Sopenharmony_ci	Co-developed-by: First Co-Author <first@coauthor.example.org>
37262306a36Sopenharmony_ci	Signed-off-by: First Co-Author <first@coauthor.example.org>
37362306a36Sopenharmony_ci	Co-developed-by: Second Co-Author <second@coauthor.example.org>
37462306a36Sopenharmony_ci	Signed-off-by: Second Co-Author <second@coauthor.example.org>
37562306a36Sopenharmony_ci	Signed-off-by: From Author <from@author.example.org>
37662306a36Sopenharmony_ci
37762306a36Sopenharmony_ci被合作开发者提交的补丁示例::
37862306a36Sopenharmony_ci
37962306a36Sopenharmony_ci	From: From Author <from@author.example.org>
38062306a36Sopenharmony_ci
38162306a36Sopenharmony_ci	<changelog>
38262306a36Sopenharmony_ci
38362306a36Sopenharmony_ci	Co-developed-by: Random Co-Author <random@coauthor.example.org>
38462306a36Sopenharmony_ci	Signed-off-by: Random Co-Author <random@coauthor.example.org>
38562306a36Sopenharmony_ci	Signed-off-by: From Author <from@author.example.org>
38662306a36Sopenharmony_ci	Co-developed-by: Submitting Co-Author <sub@coauthor.example.org>
38762306a36Sopenharmony_ci	Signed-off-by: Submitting Co-Author <sub@coauthor.example.org>
38862306a36Sopenharmony_ci
38962306a36Sopenharmony_ci
39062306a36Sopenharmony_ci使用Reported-by:、Tested-by:、Reviewed-by:、Suggested-by:和Fixes:
39162306a36Sopenharmony_ci-----------------------------------------------------------------
39262306a36Sopenharmony_ci
39362306a36Sopenharmony_ciReported-by: 给那些发现错误并报告错误的人致谢,它希望激励他们在将来再次帮助
39462306a36Sopenharmony_ci我们。请注意,如果bug是以私有方式报告的,那么在使用Reported-by标签之前,请
39562306a36Sopenharmony_ci先请求许可。此标签是为Bug设计的;请不要将其用于感谢功能请求。
39662306a36Sopenharmony_ci
39762306a36Sopenharmony_ciTested-by: 标签表示补丁已由指定的人(在某些环境中)成功测试。这个标签通知
39862306a36Sopenharmony_ci维护人员已经执行了一些测试,为将来的补丁提供了一种定位测试人员的方法,并彰显测试人员的功劳。
39962306a36Sopenharmony_ci
40062306a36Sopenharmony_ciReviewed-by:根据审阅者的监督声明,表明该补丁已被审阅并被认为是可接受的:
40162306a36Sopenharmony_ci
40262306a36Sopenharmony_ci
40362306a36Sopenharmony_ci审阅者的监督声明
40462306a36Sopenharmony_ci^^^^^^^^^^^^^^^^
40562306a36Sopenharmony_ci
40662306a36Sopenharmony_ci通过提供我的Reviewed-by:标签,我声明:
40762306a36Sopenharmony_ci
40862306a36Sopenharmony_ci        (a) 我已经对这个补丁进行了一次技术审阅,以评估它是否适合被包含到
40962306a36Sopenharmony_ci            主线内核中。
41062306a36Sopenharmony_ci
41162306a36Sopenharmony_ci        (b) 与补丁相关的任何问题、顾虑或问题都已反馈给提交者。我对提交者对
41262306a36Sopenharmony_ci            我的评论的回应感到满意。
41362306a36Sopenharmony_ci
41462306a36Sopenharmony_ci        (c) 虽然这一提交可能仍可被改进,但我相信,此时,(1)对内核
41562306a36Sopenharmony_ci            进行了有价值的修改,(2)没有包含争论中涉及的已知问题。
41662306a36Sopenharmony_ci
41762306a36Sopenharmony_ci        (d) 虽然我已经审阅了补丁并认为它是健全的,但我不会(除非另有明确
41862306a36Sopenharmony_ci            说明)作出任何保证或担保它会在任何给定情况下实现其规定的目的
41962306a36Sopenharmony_ci            或正常运行。
42062306a36Sopenharmony_ci
42162306a36Sopenharmony_ciReviewed-by是一种观点声明,即补丁是对内核的适当修改,没有任何遗留的严重技术
42262306a36Sopenharmony_ci问题。任何感兴趣的审阅者(完成工作的人)都可以为一个补丁提供一个Reviewed-by
42362306a36Sopenharmony_ci标签。此标签用于向审阅者提供致谢,并通知维护者补丁的审阅进度。
42462306a36Sopenharmony_ci当Reviewed-by:标签由已知了解主题区域并执行彻底检查的审阅者提供时,通常会增加
42562306a36Sopenharmony_ci补丁进入内核的可能性。
42662306a36Sopenharmony_ci
42762306a36Sopenharmony_ci一旦从测试人员或审阅者的“Tested-by”和“Reviewed-by”标签出现在邮件列表中,
42862306a36Sopenharmony_ci作者应在发送下一个版本时将其添加到适用的补丁中。但是,如果补丁在以下版本中发
42962306a36Sopenharmony_ci生了实质性更改,这些标签可能不再适用,因此应该删除。通常,在补丁更改日志中
43062306a36Sopenharmony_ci(在 ``---`` 分隔符之后)应该提到删除某人的测试者或审阅者标签。
43162306a36Sopenharmony_ci
43262306a36Sopenharmony_ciSuggested-by: 表示补丁的想法是由指定的人提出的,并确保将此想法归功于指定的
43362306a36Sopenharmony_ci人。请注意,未经许可,不得添加此标签,特别是如果该想法未在公共论坛上发布。
43462306a36Sopenharmony_ci也就是说,如果我们勤快地致谢创意提供者,他们将受到鼓舞,很有希望在未来再次
43562306a36Sopenharmony_ci帮助我们。
43662306a36Sopenharmony_ci
43762306a36Sopenharmony_ciFixes: 指示补丁修复了之前提交的一个问题。它可以便于确定错误的来源,这有助于
43862306a36Sopenharmony_ci检查错误修复。这个标签还帮助稳定内核团队确定应该接收修复的稳定内核版本。这是
43962306a36Sopenharmony_ci指示补丁修复的错误的首选方法。请参阅 :ref:`zh_describe_changes` 了解更多信息。
44062306a36Sopenharmony_ci
44162306a36Sopenharmony_ci.. note::
44262306a36Sopenharmony_ci
44362306a36Sopenharmony_ci  附加Fixes:标签不会改变稳定内核规则流程,也不改变所有稳定版补丁抄送
44462306a36Sopenharmony_ci  stable@vger.kernel.org的要求。有关更多信息,请阅读
44562306a36Sopenharmony_ci  Documentation/translations/zh_CN/process/stable-kernel-rules.rst44662306a36Sopenharmony_ci
44762306a36Sopenharmony_ci.. _zh_the_canonical_patch_format:
44862306a36Sopenharmony_ci
44962306a36Sopenharmony_ci标准补丁格式
45062306a36Sopenharmony_ci------------
45162306a36Sopenharmony_ci
45262306a36Sopenharmony_ci本节描述如何格式化补丁本身。请注意,如果您的补丁存储在 ``Git`` 存储库中,则
45362306a36Sopenharmony_ci可以使用 ``git format-patch`` 进行正确的补丁格式化。但是,这些工具无法创建
45462306a36Sopenharmony_ci必要的文本,因此请务必阅读下面的说明。
45562306a36Sopenharmony_ci
45662306a36Sopenharmony_ci标准的补丁标题行是::
45762306a36Sopenharmony_ci
45862306a36Sopenharmony_ci    Subject: [PATCH 001/123] 子系统:一句话概述
45962306a36Sopenharmony_ci
46062306a36Sopenharmony_ci标准补丁的信体包含如下部分:
46162306a36Sopenharmony_ci
46262306a36Sopenharmony_ci  - 一个 ``from`` 行指出补丁作者。后跟空行(仅当发送补丁的人不是作者时才需要)。
46362306a36Sopenharmony_ci
46462306a36Sopenharmony_ci  - 说明文字,每行最长75列,这将被复制到永久变更日志来描述这个补丁。
46562306a36Sopenharmony_ci
46662306a36Sopenharmony_ci  - 一个空行
46762306a36Sopenharmony_ci
46862306a36Sopenharmony_ci  - 上述的 ``Signed-off-by:`` 行,也将出现在更改日志中。
46962306a36Sopenharmony_ci
47062306a36Sopenharmony_ci  - 只包含 ``---`` 的标记线。
47162306a36Sopenharmony_ci
47262306a36Sopenharmony_ci  - 任何其他不适合放在变更日志的注释。
47362306a36Sopenharmony_ci
47462306a36Sopenharmony_ci  - 实际补丁( ``diff`` 输出)。
47562306a36Sopenharmony_ci
47662306a36Sopenharmony_ci标题行的格式,使得对标题行按字母序排序非常的容易——很多邮件客户端都
47762306a36Sopenharmony_ci可以支持——因为序列号是用零填充的,所以按数字排序和按字母排序是一样的。
47862306a36Sopenharmony_ci
47962306a36Sopenharmony_ci邮件标题中的“子系统”标识哪个内核子系统将被打补丁。
48062306a36Sopenharmony_ci
48162306a36Sopenharmony_ci邮件标题中的“一句话概述”扼要的描述邮件中的补丁。“一句话概述”
48262306a36Sopenharmony_ci不应该是一个文件名。对于一个补丁系列(“补丁系列”指一系列的多个相关补
48362306a36Sopenharmony_ci丁),不要对每个补丁都使用同样的“一句话概述”。
48462306a36Sopenharmony_ci
48562306a36Sopenharmony_ci记住邮件的“一句话概述”会成为该补丁的全局唯一标识。它会进入 ``git``
48662306a36Sopenharmony_ci的改动记录里。然后“一句话概述”会被用在开发者的讨论里,用来指代这个补
48762306a36Sopenharmony_ci丁。用户将希望通过搜索引擎搜索“一句话概述”来找到那些讨论这个补丁的文
48862306a36Sopenharmony_ci章。当人们在两三个月后使用诸如 ``gitk`` 或 ``git log --oneline`` 之类
48962306a36Sopenharmony_ci的工具查看数千个补丁时,也会很快看到它。
49062306a36Sopenharmony_ci
49162306a36Sopenharmony_ci出于这些原因,概述必须不超过70-75个字符,并且必须描述补丁的更改以及为
49262306a36Sopenharmony_ci什么需要补丁。既要简洁又要描述性很有挑战性,但写得好的概述应该这样。
49362306a36Sopenharmony_ci
49462306a36Sopenharmony_ci概述的前缀可以用方括号括起来:“Subject: [PATCH <tag>...] <概述>”。标记
49562306a36Sopenharmony_ci不被视为概述的一部分,而是描述应该如何处理补丁。如果补丁的多个版本已发
49662306a36Sopenharmony_ci送出来以响应评审(即“v1,v2,v3”)则必须包含版本号,或包含“RFC”以指示
49762306a36Sopenharmony_ci评审请求。如果一个补丁系列中有四个补丁,那么各个补丁可以这样编号:1/4、2/4、
49862306a36Sopenharmony_ci3/4、4/4。这可以确保开发人员了解补丁应用的顺序,且
49962306a36Sopenharmony_ci已经查看或应用了补丁系列中的所有补丁。
50062306a36Sopenharmony_ci
50162306a36Sopenharmony_ci一些标题的例子::
50262306a36Sopenharmony_ci
50362306a36Sopenharmony_ci    Subject: [patch 2/5] ext2: improve scalability of bitmap searching
50462306a36Sopenharmony_ci    Subject: [PATCHv2 001/207] x86: fix eflags tracking
50562306a36Sopenharmony_ci
50662306a36Sopenharmony_ci``From`` 行是信体里的最上面一行,具有如下格式::
50762306a36Sopenharmony_ci
50862306a36Sopenharmony_ci        From: Patch Author <author@example.com>
50962306a36Sopenharmony_ci
51062306a36Sopenharmony_ci``From`` 行指明在永久改动日志里,谁会被确认为作者。如果没有 ``From`` 行,那
51162306a36Sopenharmony_ci么邮件头里的 ``From:`` 行会被用来决定改动日志中的作者。
51262306a36Sopenharmony_ci
51362306a36Sopenharmony_ci说明文字将会被提交到永久的源代码改动日志里,因此应针对那些早已经不记得和这
51462306a36Sopenharmony_ci个补丁相关的讨论细节的读者。包括补丁处理的故障症状(内核日志消息、oops消息
51562306a36Sopenharmony_ci等),这对于可能正在搜索提交日志以查找适用补丁的人特别有用。文本应该写得如
51662306a36Sopenharmony_ci此详细,以便在数周、数月甚至数年后阅读时,能够为读者提供所需的细节信息,以
51762306a36Sopenharmony_ci掌握创建补丁的 **原因** 。
51862306a36Sopenharmony_ci
51962306a36Sopenharmony_ci如果一个补丁修复了一个编译失败,那么可能不需要包含 *所有* 编译失败;
52062306a36Sopenharmony_ci只要足够让搜索补丁的人能够找到它就行了。与概述一样,既要简洁又要描述性。
52162306a36Sopenharmony_ci
52262306a36Sopenharmony_ci``---`` 标记行对于补丁处理工具要找到哪里是改动日志信息的结束,是不可缺少
52362306a36Sopenharmony_ci的。
52462306a36Sopenharmony_ci
52562306a36Sopenharmony_ci对于 ``---`` 标记之后的额外注解,一个好的用途就是用来写 ``diffstat`` ,用来显
52662306a36Sopenharmony_ci示修改了什么文件和每个文件都增加和删除了多少行。 ``diffstat`` 对于比较大的补
52762306a36Sopenharmony_ci丁特别有用。
52862306a36Sopenharmony_ci使用 ``diffstat`` 的选项 ``-p 1 -w 70`` 这样文件名就会从内核源代码树的目录开始
52962306a36Sopenharmony_ci,不会占用太宽的空间(很容易适合80列的宽度,也许会有一些缩进。)
53062306a36Sopenharmony_ci( ``git`` 默认会生成合适的diffstat。)
53162306a36Sopenharmony_ci
53262306a36Sopenharmony_ci其余那些只适用于当时或者与维护者相关的注解,不合适放到永久的改动日志里的,也
53362306a36Sopenharmony_ci应该放这里。较好的例子就是 ``补丁更改记录`` ,记录了v1和v2版本补丁之间的差异。
53462306a36Sopenharmony_ci
53562306a36Sopenharmony_ci请将此信息放在将变更日志与补丁的其余部分分隔开的 ``---`` 行 **之后** 。版本
53662306a36Sopenharmony_ci信息不是提交到git树的变更日志的一部分。只是供审阅人员使用的附加信息。如果将
53762306a36Sopenharmony_ci其放置在提交标记上方,则需要手动交互才能将其删除。如果它位于分隔线以下,则在
53862306a36Sopenharmony_ci应用补丁时会自动剥离::
53962306a36Sopenharmony_ci
54062306a36Sopenharmony_ci  <commit message>
54162306a36Sopenharmony_ci  ...
54262306a36Sopenharmony_ci  Signed-off-by: Author <author@mail>
54362306a36Sopenharmony_ci  ---
54462306a36Sopenharmony_ci  V2 -> V3: Removed redundant helper function
54562306a36Sopenharmony_ci  V1 -> V2: Cleaned up coding style and addressed review comments
54662306a36Sopenharmony_ci
54762306a36Sopenharmony_ci  path/to/file | 5+++--
54862306a36Sopenharmony_ci  ...
54962306a36Sopenharmony_ci
55062306a36Sopenharmony_ci在后面的参考资料中能看到正确补丁格式的更多细节。
55162306a36Sopenharmony_ci
55262306a36Sopenharmony_ci.. _zh_backtraces:
55362306a36Sopenharmony_ci
55462306a36Sopenharmony_ci提交消息中的回溯(Backtraces)
55562306a36Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
55662306a36Sopenharmony_ci
55762306a36Sopenharmony_ci回溯有助于记录导致问题的调用链。然而,并非所有回溯都有帮助。例如,早期引导调
55862306a36Sopenharmony_ci用链是独特而明显的。而逐字复制完整的dmesg输出则会增加时间戳、模块列表、寄存
55962306a36Sopenharmony_ci器和堆栈转储等分散注意力的信息。
56062306a36Sopenharmony_ci
56162306a36Sopenharmony_ci因此,最有用的回溯应该从转储中提取相关信息,以更容易集中在真实问题上。下面是
56262306a36Sopenharmony_ci一个剪裁良好的回溯示例::
56362306a36Sopenharmony_ci
56462306a36Sopenharmony_ci  unchecked MSR access error: WRMSR to 0xd51 (tried to write 0x0000000000000064)
56562306a36Sopenharmony_ci  at rIP: 0xffffffffae059994 (native_write_msr+0x4/0x20)
56662306a36Sopenharmony_ci  Call Trace:
56762306a36Sopenharmony_ci  mba_wrmsr
56862306a36Sopenharmony_ci  update_domains
56962306a36Sopenharmony_ci  rdtgroup_mkdir
57062306a36Sopenharmony_ci
57162306a36Sopenharmony_ci.. _zh_explicit_in_reply_to:
57262306a36Sopenharmony_ci
57362306a36Sopenharmony_ci明确回复邮件头(In-Reply-To)
57462306a36Sopenharmony_ci-----------------------------
57562306a36Sopenharmony_ci
57662306a36Sopenharmony_ci手动添加回复补丁的的邮件头(In-Reply_To:)是有用的(例如,使用 ``git send-email`` ),
57762306a36Sopenharmony_ci可以将补丁与以前的相关讨论关联起来,例如,将bug补丁链接到电子邮件和bug报告。
57862306a36Sopenharmony_ci但是,对于多补丁系列,最好避免在回复时使用链接到该系列的旧版本。这样,
57962306a36Sopenharmony_ci补丁的多个版本就不会成为电子邮件客户端中无法管理的引用树。如果链接有用,
58062306a36Sopenharmony_ci可以使用 https://lore.kernel.org/ 重定向器(例如,在封面电子邮件文本中)
58162306a36Sopenharmony_ci链接到补丁系列的早期版本。
58262306a36Sopenharmony_ci
58362306a36Sopenharmony_ci给出基础树信息
58462306a36Sopenharmony_ci--------------
58562306a36Sopenharmony_ci
58662306a36Sopenharmony_ci当其他开发人员收到您的补丁并开始审阅时,知道应该将您的工作放到代码树历史记录
58762306a36Sopenharmony_ci中的什么位置通常很有用。这对于自动化持续集成流水(CI)特别有用,这些流水线试
58862306a36Sopenharmony_ci图运行一系列测试,以便在维护人员开始审阅之前确定提交的质量。
58962306a36Sopenharmony_ci
59062306a36Sopenharmony_ci如果您使用 ``git format-patch`` 生成补丁,则可以通过 ``--base`` 标志在提交中
59162306a36Sopenharmony_ci自动包含基础树信息。使用此选项最简单、最方便的方法是配合主题分支::
59262306a36Sopenharmony_ci
59362306a36Sopenharmony_ci    $ git checkout -t -b my-topical-branch master
59462306a36Sopenharmony_ci    Branch 'my-topical-branch' set up to track local branch 'master'.
59562306a36Sopenharmony_ci    Switched to a new branch 'my-topical-branch'
59662306a36Sopenharmony_ci
59762306a36Sopenharmony_ci    [perform your edits and commits]
59862306a36Sopenharmony_ci
59962306a36Sopenharmony_ci    $ git format-patch --base=auto --cover-letter -o outgoing/ master
60062306a36Sopenharmony_ci    outgoing/0000-cover-letter.patch
60162306a36Sopenharmony_ci    outgoing/0001-First-Commit.patch
60262306a36Sopenharmony_ci    outgoing/...
60362306a36Sopenharmony_ci
60462306a36Sopenharmony_ci当你编辑 ``outgoing/0000-cover-letter.patch`` 时,您会注意到在它的最底部有一
60562306a36Sopenharmony_ci行 ``base-commit:`` 尾注,它为审阅者和CI工具提供了足够的信息以正确执行
60662306a36Sopenharmony_ci``git am`` 而不必担心冲突::
60762306a36Sopenharmony_ci
60862306a36Sopenharmony_ci    $ git checkout -b patch-review [base-commit-id]
60962306a36Sopenharmony_ci    Switched to a new branch 'patch-review'
61062306a36Sopenharmony_ci    $ git am patches.mbox
61162306a36Sopenharmony_ci    Applying: First Commit
61262306a36Sopenharmony_ci    Applying: ...
61362306a36Sopenharmony_ci
61462306a36Sopenharmony_ci有关此选项的更多信息,请参阅 ``man git-format-patch`` 。
61562306a36Sopenharmony_ci
61662306a36Sopenharmony_ci.. note::
61762306a36Sopenharmony_ci
61862306a36Sopenharmony_ci    ``--base`` 功能是在2.9.0版git中引入的。
61962306a36Sopenharmony_ci
62062306a36Sopenharmony_ci如果您不使用git格式化补丁,仍然可以包含相同的 ``base-commit`` 尾注,以指示您
62162306a36Sopenharmony_ci的工作所基于的树的提交哈希。你应该在封面邮件或系列的第一个补丁中添加它,它应
62262306a36Sopenharmony_ci该放在 ``---`` 行的下面或所有其他内容之后,即只在你的电子邮件签名之前。
62362306a36Sopenharmony_ci
62462306a36Sopenharmony_ci参考文献
62562306a36Sopenharmony_ci--------
62662306a36Sopenharmony_ci
62762306a36Sopenharmony_ciAndrew Morton,“完美的补丁”(tpp)
62862306a36Sopenharmony_ci  <https://www.ozlabs.org/~akpm/stuff/tpp.txt>
62962306a36Sopenharmony_ci
63062306a36Sopenharmony_ciJeff Garzik,“Linux内核补丁提交格式”
63162306a36Sopenharmony_ci  <https://web.archive.org/web/20180829112450/http://linux.yyz.us/patch-format.html>
63262306a36Sopenharmony_ci
63362306a36Sopenharmony_ciGreg Kroah-Hartman,“如何惹恼内核子系统维护人员”
63462306a36Sopenharmony_ci  <http://www.kroah.com/log/linux/maintainer.html>
63562306a36Sopenharmony_ci
63662306a36Sopenharmony_ci  <http://www.kroah.com/log/linux/maintainer-02.html>
63762306a36Sopenharmony_ci
63862306a36Sopenharmony_ci  <http://www.kroah.com/log/linux/maintainer-03.html>
63962306a36Sopenharmony_ci
64062306a36Sopenharmony_ci  <http://www.kroah.com/log/linux/maintainer-04.html>
64162306a36Sopenharmony_ci
64262306a36Sopenharmony_ci  <http://www.kroah.com/log/linux/maintainer-05.html>
64362306a36Sopenharmony_ci
64462306a36Sopenharmony_ci  <http://www.kroah.com/log/linux/maintainer-06.html>
64562306a36Sopenharmony_ci
64662306a36Sopenharmony_ci不!!!别再发巨型补丁炸弹给linux-kernel@vger.kernel.org的人们了!
64762306a36Sopenharmony_ci  <https://lore.kernel.org/r/20050711.125305.08322243.davem@davemloft.net>
64862306a36Sopenharmony_ci
64962306a36Sopenharmony_ci内核 Documentation/translations/zh_CN/process/coding-style.rst
65062306a36Sopenharmony_ci
65162306a36Sopenharmony_ciLinus Torvalds关于标准补丁格式的邮件
65262306a36Sopenharmony_ci  <https://lore.kernel.org/r/Pine.LNX.4.58.0504071023190.28951@ppc970.osdl.org>
65362306a36Sopenharmony_ci
65462306a36Sopenharmony_ciAndi Kleen,“提交补丁之路”
65562306a36Sopenharmony_ci  一些帮助合入困难或有争议的变更的策略。
65662306a36Sopenharmony_ci
65762306a36Sopenharmony_ci  http://halobates.de/on-submitting-patches.pdf
658