设置和配置
获取和创建项目
基本快照
分支与合并
共享和更新项目
检查和比较
打补丁
调试
电子邮件
外部系统
服务器管理
指南
管理
底层命令
- 2.53.0 无变更
-
2.52.0
2025-11-17
- 2.51.1 → 2.51.2 无更改
-
2.51.0
2025-08-18
- 2.48.1 → 2.50.1 无更改
-
2.48.0
2025-01-10
- 2.46.1 → 2.47.3 无更改
-
2.46.0
2024-07-29
- 2.45.4 无更改
-
2.45.3
2024-11-26
- 2.45.1 → 2.45.2 无更改
-
2.45.0
2024-04-29
- 2.43.2 → 2.44.4 无变化
-
2.43.1
2024-02-09
-
2.43.0
2023-11-20
- 2.42.1 → 2.42.4 无更改
-
2.42.0
2023-08-21
- 2.41.1 → 2.41.3 无更改
-
2.41.0
2023-06-01
- 2.38.3 → 2.40.4 无变更
-
2.38.2
2022-12-11
- 2.36.3 → 2.38.1 无变更
-
2.36.2
2022-06-23
- 2.36.1 无变更
-
2.36.0
2022-04-18
- 2.35.1 → 2.35.8 无更改
-
2.35.0
2022-01-24
- 2.34.2 → 2.34.8 无变更
-
2.34.1
2021-11-24
- 2.33.1 → 2.34.0 无变更
-
2.33.0
2021-08-16
- 2.32.1 → 2.32.7 无变更
-
2.32.0
2021-06-06
- 2.30.2 → 2.31.8 无更改
-
2.30.1
2021-02-08
-
2.30.0
2020-12-27
- 2.28.1 → 2.29.3 无变更
-
2.28.0
2020-07-27
- 2.25.1 → 2.27.1 无变化
-
2.25.0
2020-01-13
- 2.24.1 → 2.24.4 无更改
-
2.24.0
2019-11-04
- 2.22.1 → 2.23.4 无更改
-
2.22.0
2019-06-07
- 2.20.1 → 2.21.4 无更改
-
2.20.0
2018-12-09
- 2.19.1 → 2.19.6 无更改
-
2.19.0
2018-09-10
- 2.18.1 → 2.18.5 无更改
-
2.18.0
2018-06-21
- 2.17.0 → 2.17.6 无更改
-
2.16.6
2019-12-06
-
2.15.4
2019-12-06
- 2.14.6 无更改
-
2.13.7
2018-05-22
-
2.12.5
2017-09-22
- 2.10.5 → 2.11.4 无更改
-
2.9.5
2017-07-30
-
2.8.6
2017-07-30
- 2.4.12 → 2.7.6 无变更
-
2.3.10
2015-09-28
-
2.2.3
2015-09-04
- 2.1.4 无更改
-
2.0.5
2014-12-17
此信息专用于 Git 项目
请注意,如果您打算为 Git 项目本身做贡献,此信息才与您相关。它绝不是普通 Git 用户的必读内容。
指南
这里是为本项目贡献代码的一些指南。此外,还有一个分步教程,涵盖了许多相同的准则。
补丁系列的典型生命周期
为了帮助理解本文后续给出的各种指南背后的原因,首先让我们了解本项目中一个典型补丁系列的生命周期是如何进行的。
-
你产生了一个想法或发现了一个痛点。你编写了代码。你不需要项目方的任何预先授权即可执行此操作。
你的补丁将由邮件列表上的其他贡献者进行评审,评审将评估各种事项的价值,例如补丁背后的总体思路(包括“这是否解决了一个值得解决的问题?”)、方案设计的原因以及实际实现。这里给出的指南是为了让评审人员更容易理解你的补丁,从而对你有所帮助。
-
你将补丁发送到邮件列表,并抄送给可能需要了解此更改的人员。你的目标不一定是说服他人你构建的东西很好。你的目标是获得帮助,从而针对你的“痛点”想出一个比你独自构建更好的解决方案。
可能需要了解情况的人是那些处理过你正在修改的代码的人。这些人往往最有可能拥有足够的知识来帮助你,但他们没有义务帮助你(即你是向他们寻求帮助,而不是要求)。
gitlog-p--$area_you_are_modifying可以帮助你找到他们。 -
你会收到意见和改进建议。你甚至可能以“在你的更改之上”的补丁形式收到它们。你应该在邮件列表上使用“回复全部”来回应他们,并在准备更新的补丁集时将这些建议考虑在内。
-
润色、完善并重新将补丁发送到列表以及花费时间改进你补丁的人员。回到步骤 (2)。
-
在上述迭代改进你的补丁期间,维护者可能会从列表中提取补丁并将其排入
seen分支,以便人们更容易地进行试用,而无需亲自提取并应用补丁到自己的树中。进入seen分支没有其他意义。具体来说,这并不意味着补丁以任何方式被“接受”。 -
当讨论达成共识,认为补丁的最新迭代已处于足够好的状态时,维护者会将该主题包含在每周发送几次到邮件列表的“What’s cooking”报告中,并标记为“Will merge to next(将合并至 next)”。这一决定主要由维护者在参与评审讨论的人员帮助下做出。
-
在补丁合并到 next 分支后,讨论仍可继续,通过在上方添加更多补丁来进一步改进。但当一个主题合并到 next 时,预计大家都同意该主题的范围和基本方向是适当的,因此这类增量更新仅限于细微的纠正和润色。在主题于 next 中经过一段时间(如 7 个自然日)的“酝酿”且无需进一步调整后,它将被合并到 master 分支,等待成为下一个主要版本的一部分。
在接下来的章节中,列出了许多技术和惯例,以帮助你的补丁在这样的生命周期中得到有效的评审。
选择一个起点。
作为准备步骤,你必须首先为你的工作选择一个起点。通常这意味着选择一个分支,尽管从技术上讲,它实际上是一个特定的提交(通常是该分支的 HEAD 或顶端)。
有几个重要的分支需要注意。即 gitworkflows[7] 中讨论的四个集成分支
-
maint
-
master
-
next
-
seen
列表中位置较低的分支通常是其上方分支的后代。例如,maint 是比 master “更旧”的分支,因为 master 通常在 maint 之上有补丁(提交)。
还有“主题”分支,其中包含来自其他贡献者的工作。主题分支由 Git 维护者(在他们的 fork 中)创建,用于组织邮件列表上当前传入的贡献,并在定期的“What’s cooking in git.git”公告中列出。要查找主题分支的顶端,请运行 git log --first-parent master..seen 并查找合并提交。该提交的第二个父提交就是主题分支的顶端。
选择正确起点有一个指导原则:通常,始终将你的工作建立在与你的更改相关的最旧集成分支上(参见 gitworkflows[7] 中的“向上合并”)。这一原则意味着,在绝大多数情况下,新工作的起点应该是 maint 或 master 的最新 HEAD 提交,具体取决于以下情况
-
如果你是在修复已发布版本中的错误,请使用
maint作为起点(这可能意味着你必须在不使用最近出现在master中但在已发布版本中不可用的尖端新 API 特性的情况下修复问题)。 -
否则(例如添加新功能),请使用
master。
|
注意
|
在特殊情况下,旧版本中引入的错误可能必须为比近期版本旧得多的发布版用户进行修复。git describe --contains X 可能会将引入错误的提交 X 描述为 v2.30.0-rc2-gXXXXXX,并且该错误的影响可能非常大,以至于当“Git 2.41.0”是当前版本时,我们可能需要为 Git 2.30.x 系列发布一个新的维护版本。在这种情况下,你可能需要使用 2.30.x 系列维护分支的顶端,该分支可能在 维护者的“分出”仓库中的 maint-2.30 分支里。 |
这也意味着,如果你希望你的工作有实际机会晋升到 master,那么 next 或 seen 是不合适的起点。它们的设计初衷并非作为新工作的基准;它们的存在仅仅是为了确保正在进行的主题能够良好协作。这就是为什么 next 和 seen 经常与邮件列表上收到的补丁重新集成并强制推送以替换其旧版本。一个字面上构建在 next 之上的主题无法在不拖入 next 中所有其他主题的情况下合并到 master,而其中一些主题可能尚未就绪。
例如,如果你正在进行全树范围的更改,而另一个人也在进行他们自己的全树更改,你的工作可能与另一个人的工作严重重叠。这种情况可能会诱使你使用 next 作为起点(因为它包含了另一个人的工作),但这样做意味着你不仅依赖于那个人的工作,还依赖于已经集成到 next 中的其他贡献者的所有随机内容。一旦 next 更新了新版本,你的所有工作都需要重新变基,以便维护者能够干净地应用它们。
在确实非常特殊的情况下,如果你绝对必须依赖已经在 next 中但不在 master 中的少数选定主题分支,你可以通过从 master 派生并合并所需的主题分支来创建自己的自定义基准分支。然后你可以在此基准分支之上工作。但请记住,这个基准分支只有你私下知道。因此,当你准备好将补丁发送到列表时,请务必在自述信(cover letter)中说明你是如何创建它的。这一关键信息将允许他人在他们那边重建你的基准分支,以便试用你的工作。
最后,请注意系统的某些部分有专门的维护者,他们拥有独立的源代码仓库(参见下文“子系统”部分)。
为逻辑上独立的更改分别提交。
除非你的补丁非常微不足道,否则你不应该发送在工作树和提交头之间生成的补丁。相反,始终创建一个带有完整提交消息的提交,并从你的仓库生成一系列补丁。这是一种良好的习惯。
对更改给出足够详细的解释,以便人们在不阅读实际补丁文本的情况下,就能判断这样做是否是一件好事,并确定代码在多大程度上实现了说明中所承诺的内容。
如果你的描述开始变得太长,这预示着你可能需要将提交拆分为更细粒度的部分。话虽如此,清晰描述有助于评审人员检查补丁、帮助未来维护者理解代码的补丁是最完美的补丁。在标题中很好地总结要点,描述更改的动机、更改所采取的方法,以及(如果相关的话)这与之前版本有何实质性不同,这些都是很好的做法。
确保你为所修复的错误编写了测试。请参阅 t/README 获取指导。
添加新功能时,请确保有新的测试来展示该功能在应该触发时触发了新行为,并展示在不应该触发时不触发。在任何代码更改后,确保整个测试套件都能通过。修复错误时,确保有新的测试,如果有人不小心破坏了你修复的内容,这些测试就会失败,以避免回归。此外,尝试将你的工作合并到 next 和 seen 并确保测试仍然通过;其他人正在进行的主题可能与你试图在自己的主题中执行的操作产生意外的交互作用。
推送到 https://github.com/git/git 的 fork 将使用其 CI 集成在 Linux、Mac 和 Windows 上测试你的更改。有关详细信息,请参阅 GitHub CI 部分。
不要忘记更新文档以描述更新后的行为,并确保生成的文档集格式良好(尝试使用 Documentation/doc-diff 脚本)。
目前我们混合使用了美式英语和英式英语的拼写和语法规范,这有些令人遗憾。但是,不欢迎为了纠正这种不一致而触及各处文件的大型补丁。这种补丁可能与其他更改产生冲突,不值得这样做。我们倾向于在进行其他实际工作的同时(例如,为了清晰起见重写一段话,同时将英式拼写改为美式),通过细小且易于消化的补丁逐步将不一致之处调和为美式英语。显而易见的排版修复更受欢迎(例如 "teh" → "the"),最好作为独立于其他文档更改的补丁提交。
哦,还有一件事。我们对空白字符(whitespaces)非常挑剔。确保你的更改不会触发 templates/hooks--pre-commit 中附带的示例 pre-commit 钩子错误。为了确保不发生这种情况,请在提交前对你的更改运行 git diff --check。
良好地描述你的更改。
解释你更改的日志消息与更改本身同样重要。你的代码可能写得很清楚,并配有代码内注释以充分解释它如何与周围代码协作,但未来需要修复或增强你代码的人需要知道你的代码为什么要这样做,原因如下:
-
你的代码执行的操作可能与你的初衷有所不同。写下你实际想要实现的目标将帮助他们修复你的代码并使其执行应有的操作(此外,在编写日志消息以总结背后的想法时,你通常会自己发现自己的错误)。
-
你的代码执行的操作可能仅仅是为了满足你的当务之急(例如,“对目录执行 X”,而没有实现甚至没有设计对文件执行什么)。写下你为什么排除代码未涵盖的内容将有助于指导未来的开发人员。写下“我们对目录执行 X,因为目录具有特性 Y”将帮助他们推断“哦,文件也具有相同的特性 Y,那么对它们执行 X 是否也有意义?”。说明“我们不对文件执行相同的 X,因为……”将帮助他们决定该推理是否合理(在这种情况下,他们不会浪费时间扩展你的代码以覆盖文件),或者进行不同的推理(在这种情况下,他们可以解释为什么他们也要扩展你的代码以覆盖文件)。
日志消息的目标是向未来的开发人员传达更改背后的原因。评审人员还将确保你提议的日志消息能够很好地服务于这一目的。
提交消息的第一行应该是简短的描述(50 个字符是软限制,参见 git-commit[1] 中的 DISCUSSION 部分),并且应该省略句号。在大多数情况下,按照惯例,第一行要加上前缀 "area: ",其中 area 是文件名或被修改代码大致区域的标识符,例如:
-
doc: clarify distinction between sign-off and pgp-signing
-
githooks.txt: improve the intro section
如果不确定使用哪个标识符,请对正在修改的文件运行 git log --no-merges 以查看当前的惯例。
"area:" 前缀后的标题句省略末尾的句号,且其首字母不带大写(不带大写仅适用于标题中 "area:" 前缀后的单词),除非除了作为句子首词之外还有其他理由将其大写。例如 "doc: clarify…",而不是 "doc: Clarify…",或 "githooks.txt: improve…",而不是 "githooks.txt: Improve…"。但 "refs: HEAD is also treated as a ref" 是正确的,因为即使 HEAD 出现在句子中间,我们也将其拼写为全大写。
正文应提供有意义的提交消息,其中应:
-
说明更改尝试解决的问题,即如果没有该更改,当前代码有什么问题。
-
证明更改解决问题的方式是合理的,即为什么更改后的结果更好。
-
(如果有)说明曾考虑过但被放弃的其他替代方案。
描述现状的问题陈述应使用一般现在时。写成 "The code does X when it is given input Y"(当给定输入 Y 时,代码执行 X),而不是 "The code used to do Y when given input X"(当给定输入 X 时,代码过去执行 Y)。你不需要说 "Currently"(当前)——按照项目惯例,问题陈述中的现状是指没有你的更改时的代码状态。
使用祈使语气描述你的更改,例如 "make xyzzy do frotz"(让 xyzzy 执行 frotz),而不是 "[This patch] makes xyzzy do frotz"(本补丁让 xyzzy 执行 frotz)或 "[I] changed xyzzy to do frotz"(我更改了 xyzzy 以执行 frotz),就好像你在命令代码库改变其行为一样。尽量确保你的解释在没有外部资源的情况下也能被理解。不要只给出邮件列表归档的 URL,而是总结讨论的相关要点。
有几个原因可能会让你想要引用历史记录中“更稳定”部分的另一个提交(即在 maint、master 和 next 等分支上的提交):
-
引入了你正在修复的错误根源的提交。
-
引入了你正在增强的功能的提交。
-
当你为了测试将工作试合并到
next和seen时,与你的工作发生冲突的提交。
当你引用更稳定分支(如 master、maint 和 next)上的提交时,请使用“短哈希 (主题, 日期)”格式,如下所示:
Commit f86a374 (pack-bitmap.c: fix a memleak, 2015-03-30) noticed that ...
可以使用 gitk 的 "Copy commit reference" 命令来获取此格式(主题括在双引号中),或者调用如下 git show 命令:
git show -s --pretty=reference <commit>
或者,在不支持 --pretty=reference 的旧版本 Git 上:
git show -s --date=short --pretty='format:%h (%s, %ad)' <commit>
通过添加 Signed-off-by 尾注来认证你的工作
为了更好地追踪谁做了什么,我们要求你通过“签署 (signing off)”你的补丁,来证明是你编写了该补丁,或者有权在与我们相同的许可下传递它。如果没有签署,我们无法接受你的补丁。
如果(且仅当)你证明以下 D-C-O(开发者原创证明):
通过向本项目做出贡献,我证明:
(a) 该贡献全部或部分由我创建,且我有权在文件中注明的开源许可下提交它;或者
(b) 该贡献基于以前的工作,据我所知,这些工作涵盖在适当的开源许可下,且我有权在该许可下提交经过修改的该工作(无论修改是全部还是部分由我创建),并使用相同的开源许可(除非我被允许在不同的许可下提交),如文件中所示;或者
(c) 该贡献由证明过 (a)、(b) 或 (c) 的其他人直接提供给我,且我未对其进行修改。
(d) 我理解并同意本项目及该贡献是公开的,且该贡献的记录(包括我随之提交的所有个人信息,包括我的签署)将无限期保留,并可能根据本项目或所涉及的开源许可进行重新分发。
你在提交中添加一个 "Signed-off-by" 尾注,看起来像这样:
Signed-off-by: Random J Developer <random@developer.example.org>
如果你在运行 git-commit 命令时带有 -s 选项,Git 可以自动添加此行。
请注意,根据上述 D-C-O 规则转发他人的补丁时,你可以加上自己的 Signed-off-by 尾注。事实上,我们鼓励你这样做。不要忘记在正文开头放置一个 "From: " 行,以便正确地将更改归功于其真实作者(参见上文 (2))。
此程序最初源自 Linux 内核项目,因此我们的规则与其非常相似,但签署补丁的确切含义因项目而异,因此它可能与你习惯的项目有所不同。
请在 Signed-off-by 尾注中使用已知身份,因为我们不接受匿名贡献。通常(但非强制)使用某种形式的真实姓名。我们意识到某些贡献者不愿这样做,或者更愿意以笔名或常用名进行贡献,只要你使用的姓名和电子邮件是独特的、可识别的且不具有误导性,我们就可以接受你的补丁。
此政策的目标是让我们在对你的贡献产生疑问时拥有足够的联系信息。
如果你愿意,可以在末尾添加额外的尾注:
-
Reported-by:用于表彰发现补丁试图修复的错误的人。 -
Acked-by:表示熟悉补丁试图修改的区域的人喜欢该补丁。 -
Reviewed-by:与其他尾注不同,只能由评审人员在经过详细分析并对补丁完全满意后自行提供。 -
Tested-by:用于表示该人员应用了补丁并发现它产生了预期效果。 -
Co-authored-by:用于表示多人在提交补丁之前交换了草案。 -
Helped-by:用于表彰为更改提供建议但未提供具体补丁代码的人。 -
Mentored-by:用于表彰在导师计划(例如 GSoC 或 Outreachy)中帮助开发补丁的人。 -
Suggested-by:用于表彰提出补丁想法的人。
虽然你也可以根据情况创建自己的尾注,但我们鼓励你使用上述本项目中常用的尾注。
仅将尾注的首字母大写,即推荐使用 "Signed-off-by" 而非 "Signed-Off-By",以及 "Acked-by:" 而非 "Acked-By"。
人工智能 (AI) 的使用
开发者原创证明 (DCO) 要求贡献者证明他们了解其对项目贡献的来源,并有权在项目许可下提交。目前尚不清楚,在提交由 AI 工具生成的大量内容时,是否能从法律上满足这一要求。
AI 生成内容的另一个问题是,即使你指出了它们的错误,AI 仍经常会产生幻觉,或者仅仅是生成糟糕的代码、提交消息、文档或输出。
为了避免这些问题,我们将拒绝任何看起来像是 AI 生成的、听起来过于正式或臃肿的、看起来像 AI 废话的、表面上看起来不错但毫无意义的,或者发送者不理解或无法解释的内容。
我们强烈建议谨慎且负责任地使用 AI 工具。
通过使用 AI 引导和帮助自己一步步产生解决方案,而不是索要一个然后大部分复制粘贴的完整方案,贡献者往往能从 AI 中获益更多。在发送给我们之前,他们还可以使用 AI 辅助调试,或者检查明显的错误、可以改进的地方、不符合我们的风格、指南或反馈的地方。
使用 Git 工具从你的提交中生成补丁。
基于 Git 的 diff 工具生成 unidiff 格式,这是首选格式。
如果你的补丁涉及文件重命名,不必担心在 git diff 或 git format-patch 中使用 -M 选项。接收端可以很好地处理它们。
请确保你的补丁没有添加被注释掉的调试代码,也不包含任何与补丁目标无关的额外文件。生成补丁后务必进行检查,以确保准确性。在发送之前,请确保它能干净地应用到你在“选择起点”章节中选择的起点。
|
注意
|
从评审人员的角度来看,master 分支是默认的预期起点。因此,如果你选择了不同的起点,请在自述信中说明这一选择。 |
发送你的补丁。
选择评审人员
|
注意
|
可能与安全相关的补丁应私下提交至 Git 安全邮件列表[1],而不是公开邮件列表。 |
发送补丁时,“收件人 (To:)”设置为邮件列表,“抄送 (cc:)”列出涉及你所修改区域的人员(contrib/contacts/ 中的 git-contacts 脚本[2]可以帮助识别他们),以征求意见和评审。此外,当你将主题试合并到 next 和 seen 时,你可能已经注意到他人的工作与你的更改发生冲突。这些人很有可能非常了解你所修改的区域。
如果你使用 send-email,可以像这样将 git-contacts 的输出提供给它:
git send-email --cc-cmd='perl contrib/contacts/git-contacts' feature/*.patch
在列表达成共识认为应用该补丁是个好主意后,请重新发送补丁,“收件人 (To:)”设置为维护者[3],“抄送 (cc:)”设置为列表[4]以供纳入。当维护者没有深度参与讨论,而是将评审留给其他受信任的人时,这一点尤为重要。
不要忘记根据需要添加 Acked-by:、Reviewed-by: 和 Tested-by: 等尾注,以表彰帮助过你补丁的人,并在发送此类最终纳入版本时“抄送 (cc:)”他们。
format-patch 和 send-email
如果可能,请学会使用 format-patch 和 send-email。这些命令针对发送补丁的工作流进行了优化,避免了现有电子邮件客户端(通常针对 "multipart/*" MIME 类型邮件进行优化)使补丁变得无法使用的许多情况。
|
注意
|
这里我们概述了使用 format-patch 和 send-email 的过程,但你也可以使用 GitGitGadget 来发送补丁(参见 MyFirstContribution)。 |
Git 邮件列表上的人员需要能够阅读并评论你提交的更改。开发者能够使用标准的电子邮件工具“引用”你的更改以便对代码的特定部分发表评论是非常重要的。出于这个原因,每个补丁都应该作为一条独立消息“内联”提交。
补丁系列的所有后续版本及其他相关补丁都应分组到各自的电子邮件线程中,以帮助读者找到该系列的所有部分。为此,请将它们作为对额外的“自述信”消息(见下文)、第一个补丁或各自前一个补丁的回复发送。这里有一个关于如何提交补丁系列更新版本的分步指南。
如果你的日志消息(包括 Signed-off-by 尾注中的姓名)无法用 ASCII 编写,请确保以正确的编码发送邮件。
|
警告
|
警惕邮件客户端的自动换行损坏你的补丁。不要剪切粘贴补丁;如果不小心,这种方式会丢失制表符 (tabs)。 |
一个常见的惯例是在主题行前加上 [PATCH] 前缀。这让人们可以轻松地将补丁与其他邮件讨论区分开来。也鼓励在方括号内除了 PATCH 之外再使用其他标记来描述补丁的性质。例如 [RFC PATCH](RFC 代表“征求意见”)通常用于表示补丁在被接受前需要进一步讨论;[PATCH v2]、[PATCH v3] 等常见于发送之前发送内容的更新版本时。
git format-patch 命令遵循当前格式化电子邮件正文的最佳实践。补丁开头应该是你的提交消息,以 Signed-off-by 尾注结束,然后是一行由三个破折号组成的内容,随后是 diffstat 信息和补丁本身。如果你在转发他人的补丁,可以选用地在邮件正文开头、提交消息开始之前放置一个 "From: " 行来指名那个人。要将主题中默认的 "[PATCH]" 更改为 "[<文本>]",请使用 git format-patch --subject-prefix=<文本>。作为快捷方式,你可以使用 --rfc 代替 --subject-prefix="RFC PATCH",或者使用 -v <n> 代替 --subject-prefix="PATCH v<n>"。
你经常想在提交消息本身之外添加关于补丁的额外说明。将此类“自述信”内容放在三破折号行和 diffstat 之间。对于需要多轮评审和讨论的补丁,每一轮之间的更改说明可以保存在 Git-notes 中,并通过 git format-patch --notes 自动插入到三破折号行之后。
这是实验性的.
发送主题时,你可以选用地建议一个主题名称和/或一段摘要,以便在该主题被提取时出现在“What’s cooking”报告中用以解释。如果你选择这样做,请写一段 2-5 行的话,使其能很好地融入我们的发布说明(参见 Documentation/RelNotes/* 文件中许多带项符号的条目示例),并将其作为自述信的第一段(如果包含建议的主题名称,则为第二段)。如果建议主题名称,请使用 "XX/your-topic-name" 格式,其中 "XX" 代表主作者的姓名首字母缩写,"your-topic-name" 是对你主题内容的简短、以连字符分隔的描述。对于单补丁系列,请使用前文所述的三破折号行和 diffstat 之间的空间。
如果你的补丁系列是跨越多个补丁系列的大型工作的一部分,请简要描述更广泛的目标,并说明当前系列在其中的位置。如果你像上一节中那样建议主题名称,请考虑使用 "XX/the-broader-goal-part-one"、"XX/the-broader-goal-part-two" 等。
不要将补丁作为 MIME 附件发送,无论是否压缩。不要让你的邮件客户端发送 quoted-printable 格式。不要让邮件客户端发送 format=flowed,这会破坏补丁中的空白字符。许多流行的邮件程序并不总是以纯文本形式传输 MIME 附件,导致无法对你的代码进行评论。MIME 附件处理起来也需要更多时间。这虽然不会降低你的 MIME 附件更改被接受的可能性,但更有可能使其被推迟处理。
例外情况:如果你的邮件程序弄乱了补丁,而有人要求你使用 MIME 重新发送,那是可以的。
不要对补丁进行 PGP 签名。很有可能维护者或列表上的其他人没有你的 PGP 密钥,也不会费心去获取。你的补丁并非根据你的身份来评判;来自无名氏的优秀补丁被接受的机会远大于来自受人尊敬的知名人士但做得很差或有误的补丁。
如果你真的非常非常非常想发送 PGP 签名的补丁,请将其格式化为 "multipart/signed",而不是以 -----BEGIN PGP SIGNED MESSAGE----- 开头的 text/plain 邮件。那不是纯文本,而是别的东西。
处理冲突和迭代补丁
在修改对补丁所做的更改时,确认与其他进行中主题发生冲突的可能性非常重要。为了有效应对这些潜在冲突,请遵循以下推荐步骤:
-
建立在合适的基准分支上(见上文章节),并对系列进行 format-patch。如果你是在原位进行 "rebase -i" 以从上一轮更新,这将重用之前的基准,因此 (2) 和 (3) 可能会变得非常简单。
-
找到上一轮排队时的基准。
$ mine='kn/ref-transaction-symref' $ git checkout "origin/seen^{/^Merge branch '$mine'}...master" -
应用你的 format-patch 结果。有两种情况:
-
应用干净且测试良好。转到 (4)。
-
应用干净但无法构建或测试失败,或者应用不干净。
在后一种情况下,由于旧基准和你用于构建 (1) 的基准之间的差异,你遇到了文本或语义冲突。查明是什么导致了破坏(例如,在 (2) 使用的基准和 (1) 使用的基准之间,可能已经合并了一两个主题)。
切出最新的 origin/master(它可能比 (2) 使用的基准更新),用 "merge --no-ff" 将你新依赖的主题合并进去,并将合并结果作为基准,重新构建系列并再次测试。运行 format-patch,范围从最后一次此类合并到你主题的顶端。如果你执行了:
$ git checkout origin/master $ git merge --no-ff --into-name kn/ref-transaction-symref fo/obar $ git merge --no-ff --into-name kn/ref-transaction-symref ba/zqux ... rebuild the topic ...
那么你只需在这些“铺路”合并之上格式化你的主题,例如:
$ git format-patch "HEAD^{/^Merge branch 'ba/zqux'}"..HEAD不要忘记在自述信中写明你这样做了,包括你在 master 之上的基准中包含的主题。然后转到 (4)。
-
-
将你的主题试合并到 next 和 seen,例如:
$ git checkout --detach 'origin/seen' $ git revert -m 1 <the merge of the previous iteration into seen> $ git merge kn/ref-transaction-symref
如果你的主题的上一个迭代已经存在于 seen 中(如此例所示),则需要执行 "revert"。你可以选择从头开始重新构建 master..origin/seen 并排除你之前的迭代,这可能更接近于维护者那端发生的情况。
这种试合并可能会发生冲突。其主要目的是查看其他主题可能与你的主题发生什么冲突。换句话说,你不需要依赖它来使你的主题在 master 上运行。如果你的主题比其他主题先进入 next,解决冲突可能是其他主题所有者的工作。
在自述信中注明你看到的冲突。你不一定要解决它们,但这是一个了解他人在相关领域所做工作的好机会。
$ git checkout --detach 'origin/next' $ git merge kn/ref-transaction-symref
这是为了查看你的主题与正在酝酿的其他主题之间有什么冲突。如果 (3)-2 在更新后的 master 加上从 next 提取的依赖主题之上准备了基准,那么这不应发生冲突。除非上下文冲突非常严重(一种辨别方法是尝试对旧版本进行相同的试合并,如果冲突方式类似则说明严重),否则请预期它将在维护者端处理(如果变得无法管理,我会在收到你的补丁时要求变基)。
拥有专用维护者的子系统
系统的某些部分有专门的维护者,并拥有自己的代码仓库。
-
git-gui/来自 git-gui 项目,由 Johannes Sixt 维护。https://github.com/j6t/git-gui
Contibutions should go via the git mailing list.
-
gitk-git/来自 gitk 项目,由 Johannes Sixt 维护。https://github.com/j6t/gitk
Contibutions should go via the git mailing list.
-
po/来自本地化协调员 Jiang Xin。https://github.com/git-l10n/git-po/
针对这些部分的补丁应基于他们的代码树。
-
由 Jean-Noël Avila 领导的“Git 文档翻译”项目负责翻译我们的文档页面。他们的工作成果独立于本项目维护,不作为我们代码树的一部分。
https://github.com/jnavila/git-manpages-l10n/
GitHub CI
拥有 GitHub 账户后,你可以使用 GitHub CI 在 Linux、Mac 和 Windows 上测试你的更改。有关近期 CI 运行的示例,请参阅 https://github.com/git/git/actions/workflows/main.yml。
按照以下步骤进行初始设置:
-
将 https://github.com/git/git fork 到你的 GitHub 账户。你可以在此处找到如何 fork 的详细说明:https://help.github.com/articles/fork-a-repo/
初始设置后,每当你向 GitHub 上的 Git fork 推送新更改时,CI 都会运行。你可以在此处监控所有分支的测试状态:https://github.com/<你的 GitHub 用户名>/git/actions/workflows/main.yml
如果某个分支未通过所有测试用例,它将被标记为红色 x,而不是绿色对号。在这种情况下,你可以单击失败的任务并导航到 "ci/run-build-and-tests.sh" 和/或 "ci/print-test-failures.sh"。你还可以下载 "Artifacts"(伪像),它是 zip 压缩包,包含与调试相关的测试数据归档。
然后修复问题并将修复推送到你的 GitHub fork。这将触发新的 CI 构建以确保所有测试通过。
特定邮件客户端 (MUA) 的提示
我收到或从列表中提取的一些补丁具有常见的损坏模式。请确保你的 MUA 设置正确,以免损坏空白字符。
有关通过将补丁邮寄给自己并使用 git-am[1] 应用补丁来检查补丁的提示,请参阅 git-format-patch[1] 的 DISCUSSION 部分。
在此过程中,检查试运行应用补丁后生成的提交日志消息。如果生成的提交中的内容不完全是你想要的,维护者在应用你的补丁时很可能最终不得不手动编辑日志消息。像 "Hi, this is my first patch.\n" 这样的话,如果你确实想放在补丁邮件中,应该放在表示提交消息结束的三破折号行之后。
Pine
(Johannes Schindelin)
I don't know how many people still use pine, but for those poor souls it may be good to mention that the quell-flowed-text is needed for recent versions. ... the "no-strip-whitespace-before-send" option, too. AFAIK it was introduced in 4.60.
(Linus Torvalds)
And 4.58 needs at least this.
diff-tree 8326dd8350be64ac7fc805f6563a1d61ad10d32c (from e886a61f76edf5410573e92e38ce22974f9c40f1)
Author: Linus Torvalds <torvalds@g5.osdl.org>
Date: Mon Aug 15 17:23:51 2005 -0700
Fix pine whitespace-corruption bug
There's no excuse for unconditionally removing whitespace from
the pico buffers on close.
diff --git a/pico/pico.c b/pico/pico.c
--- a/pico/pico.c
+++ b/pico/pico.c
@@ -219,7 +219,9 @@ PICO *pm;
switch(pico_all_done){ /* prepare for/handle final events */
case COMP_EXIT : /* already confirmed */
packheader();
+#if 0
stripwhitespace();
+#endif
c |= COMP_EXIT;
break;
(Daniel Barkalow)
> A patch to SubmittingPatches, MUA specific help section for > users of Pine 4.63 would be very much appreciated. Ah, it looks like a recent version changed the default behavior to do the right thing, and inverted the sense of the configuration option. (Either that or Gentoo did it.) So you need to set the "no-strip-whitespace-before-send" option, unless the option you have is "strip-whitespace-before-send", in which case you should avoid checking it.
Thunderbird, KMail, GMail
请参阅 git-format-patch[1] 的 MUA-SPECIFIC HINTS 部分。