简体中文 ▾ 主题 ▾ 最新版本 ▾ SubmittingPatches 上次更新于 2.52.0

此信息专用于 Git 项目

请注意,如果您打算为 Git 项目本身做贡献,此信息才与您相关。它绝不是普通 Git 用户的必读内容。

指南

以下是一些为本项目贡献代码的指南。还有一个 分步教程,其中涵盖了许多相同的指南。

一个典型的补丁系列生命周期

为了帮助我们理解文档中后续各种指南的原因,首先让我们了解一下这个项目典型的补丁系列是如何产生生命周期的。

  1. 你发现了一个痛点。你写了代码。你不需要项目的任何预先授权。

    你的补丁将由邮件列表上的其他贡献者审查,审查将用于评估各种事物的价值,例如你的补丁背后的基本思想(包括“它是否解决了值得解决的问题?”)、解决方案设计的原因以及实际实现。这里的指南是为了让你的补丁更容易被审查者理解。

  2. 你将补丁发送到列表,并将可能需要了解此更改的人员抄送。你的目标**不是**要说服他人你正在构建的东西是好的。你的目标是获得帮助,以一种比你独自完成更好的方式来解决“痛点”。

    可能需要了解的人是那些处理过你正在修改的代码的人。这些人碰巧最有可能有足够的知识来帮助你,但他们没有义务帮助你(即,你请求他们帮助,而不是要求)。git log -p -- 你正在修改的区域 将有助于你找出他们是谁。

  3. 你会收到改进的评论和建议。你甚至可能以“在你的更改之上”的补丁形式收到它们。你被期望在邮件列表上以“全部回复”的方式回应它们,同时在准备更新的补丁集时考虑它们。

  4. 润色、完善并重新将你的补丁发送到列表以及那些花费时间改进你补丁的人。回到步骤 (2)。

  5. 在上述迭代改进你的补丁时,维护者可能会从列表中挑选补丁并将其排队到 seen 分支,以便人们可以轻松地使用它,而不必自己将补丁应用到他们的树上。处于 seen 分支没有任何其他含义。特别是,它不代表补丁在任何意义上都被“接受”。

  6. 当讨论达成共识,认为最新迭代的补丁已经足够好时,维护者会将该主题包含在每周发送到邮件列表的“What’s cooking”报告中,标记为“Will merge to next”。这个决定主要由维护者做出,并得到那些参与审查讨论的人的帮助。

  7. 在补丁合并到 _next_ 分支后,讨论仍然可以继续通过添加更多补丁来进一步改进它们,但当一个主题合并到 _next_ 时,预计每个人都同意该主题的范围和基本方向是适当的,因此这种增量更新仅限于小的更正和润色。当一个主题在 _next_ 分支中经过一段时间(例如 7 个日历日)的调整后,不再需要进一步的修改,它将被合并到 _master_ 分支,等待成为下一个主要版本的一部分。

在接下来的部分中,列出了许多技术和约定,以帮助你的补丁在这种生命周期中得到有效审查。

选择一个起点。

作为初步步骤,你必须首先为你的工作选择一个起点。通常这意味着选择一个分支,尽管从技术上讲,它实际上是一个特定的提交(通常是分支的 HEAD 或尖端)。

有几个重要的分支需要注意。即,有四个集成分支,如 gitworkflows[7] 中所述。

  • maint

  • master

  • next

  • seen

列表中较早的分支通常是比它们靠前的分支的后代。例如,maintmaster 是一个“更老”的分支,因为 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.30.x 系列发布一个新的维护版本,而“Git 2.41.0”是当前发布的版本。在这种情况下,你可能想使用 2.30.x 系列的维护分支的尖端,这可能在 维护者的“独立”仓库 中的 maint-2.30 分支中可用。

这也意味着,如果你想让你的工作有机会升级到 master,那么 _next_ 或 _seen_ 不适合作为你工作的起点。它们根本不是为作为新工作的基础而设计的;它们只是为了确保正在进行的主题能协同工作。这就是为什么 _next_ 和 _seen_ 经常与邮件列表上的传入补丁重新集成并强制推送以替换它们以前的版本。一个字面上建立在 _next_ 之上的主题,在没有将 _next_ 中的所有其他尚未准备好的主题拖入的情况下,无法合并到 _master_。

例如,如果你正在进行跨整个系统的更改,而其他人也在进行他们自己的跨整个系统的更改,那么你的工作可能会与其他人的工作产生严重的重叠。这种情况可能会诱使你使用 _next_ 作为你的起点(因为它包含了其他人的工作),但这样做意味着你不仅依赖于其他人的工作,还依赖于已经集成到 _next_ 中的来自其他贡献者的所有其他随机事物。并且一旦 _next_ 被新版本更新,你的所有工作都将需要重新定位,以便维护者可以干净地应用它们。

在绝对必须依赖 _next_ 中已存在但 _master_ 中不存在的少数主题分支的真正特殊情况下,你可能想通过 fork _master_ 并将所需的主题分支合并到其中来创建自己的自定义基础分支。然后你可以在这个基础分支之上工作。但请记住,这个基础分支只会对你个人可见。所以当你准备将你的补丁发送到列表时,请务必在你的封面信中说明你是如何创建它的。这个关键信息将允许其他人复现你的基础分支,以便他们可以试用你的工作。

最后,请注意,系统的某些部分有专门的维护者,他们有自己的独立源代码仓库(参见下面的“子系统”部分)。

为逻辑上独立的更改创建单独的提交。

除非你的补丁非常微小,否则你不应该发送一个在你的工作树和你的提交头之间生成的补丁。相反,始终使用完整的提交消息创建一个提交,并从你的仓库生成一系列补丁。这是一个很好的习惯。

对更改提供足够详细的解释,以便人们能够判断它是否是一件好事,而无需阅读实际的补丁文本来确定代码在多大程度上实现了解释的承诺。

如果你的描述开始变得太长,这表明你可能需要将你的提交分成更细粒度的部分。也就是说,能够帮助审查者检查补丁并使未来的维护者理解代码的补丁是最漂亮的。主题总结了要点的描述,解释了更改的动机、所采取的方法,以及如果相关,与先前版本有何实质性不同,这些都是很好的内容。

确保你为要修复的错误提供了测试。有关指导,请参见 t/README

添加新功能时,确保你有新的测试来表明功能在应该触发时触发了新行为,并且在不应该触发时没有触发。在任何代码更改后,确保整个测试套件都能通过。修复错误时,确保你有新的测试,如果有人意外破坏了你修复的内容,这些测试会失败,以避免回归。另外,尝试将你的工作合并到 _next_ 和 _seen_ 中,并确保测试仍然通过;其他人仍在进行中的主题可能与你正在进行的主题产生意外的交互。

推送到 https://github.com/git/git 的 fork 将使用他们的 CI 集成在 Linux、Mac 和 Windows 上测试你的更改。有关详细信息,请参阅 GitHub CI 部分。

不要忘记更新文档以描述已更新的行为,并确保生成的文档集格式正确(尝试 Documentation/doc-diff 脚本)。

我们目前在拼写和语法上混合了美式和英式英语的规范,这有些不幸。然而,一个巨大的补丁,为了纠正不一致性而触及了所有地方的文件,是不会受欢迎的。这种补丁可能与其他更改产生的潜在冲突是不值得的。我们宁愿通过小的、易于理解的补丁,作为做一些附近实际工作(例如,为了清晰而重写一段话,同时将英式拼写转换为美式拼写)的副作用,来逐渐调和不一致性,偏向美式英语。明显的拼写错误(“teh → the”)则更受欢迎,最好作为独立于其他文档更改的补丁提交。

哦,还有一件事。我们对空格很挑剔。确保你的更改不会触发 templates/hooks--pre-commit 中提供的示例预提交钩子的错误。为了帮助确保这种情况不会发生,在提交更改之前,请运行 git diff --check

好好描述你的更改。

解释你更改的日志消息与更改本身一样重要。你的代码可能写得很清楚,有代码内注释来充分解释它如何与周围的代码协同工作,但那些将来需要修复或增强你的代码的人需要知道你的代码**为什么**这样做,有几个原因:

  1. 你的代码可能做的事情与你想要的有所不同。写下你实际想要达成的目标将有助于他们修复你的代码并使其按预期工作(此外,你在编写总结其背后思想的日志消息时,常常会发现自己的错误)。

  2. 你的代码可能在做一些只满足你即时需求的事情(例如,“对目录执行 X”而不实现甚至不设计对文件要做什么)。写下你为什么排除代码不执行的内容将有助于指导未来的开发者。写下“我们对目录执行 X,因为目录具有特性 Y”将有助于他们推断“哦,文件也具有相同的特性 Y,那么对它们执行 X 可能也有意义?”。说“我们不对文件做同样的事情,因为……”将帮助他们决定理由是否充分(在这种情况下,他们就不会浪费时间将你的代码扩展到覆盖文件),或者他们会以不同的方式思考(在这种情况下,他们可以解释为什么他们将你的代码扩展到也覆盖文件)。

你的日志消息的目标是传达你更改背后的**原因**,以帮助未来的开发者。审查者还将确保你提议的日志消息能够很好地实现这一目的。

提交消息的第一行应该是简短的描述(50 个字符是软限制,参见 git-commit[1] 的 DISCUSSION),并且应省略句号。在大多数情况下,还习惯性地在第一行前面加上“area: ”,其中 area 是一个文件名或标识符,表示要修改的代码的通用区域,例如:

  • doc: 澄清 sign-off 和 pgp-signing 之间的区别

  • githooks.txt: 改进介绍部分

如果不确定使用哪个标识符,请运行 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

正文应提供有意义的提交消息,该消息

  1. 解释了更改试图解决的问题,即在没有更改的情况下当前代码有什么问题。

  2. 证明了更改解决问题的方式,即为什么更改后的结果更好。

  3. 考虑过但被放弃的备选解决方案,如果有的话。

描述现状的问题陈述以现在时态书写。写“代码在给定输入 Y 时执行 X”,而不是“代码过去在给定输入 X 时执行 Y”。你不必说“目前”——问题陈述中的现状是关于**没有**你更改的代码,按照项目约定。

用命令式语气描述你的更改,例如,“make xyzzy do frotz”而不是“[This patch] makes xyzzy do frotz”或“[I] changed xyzzy to do frotz”,就像你正在给代码库下达命令来改变其行为一样。尽量确保你的解释无需外部资源就能理解。不要提供指向邮件列表存档的 URL,而是总结讨论的相关要点。

你可能想引用历史记录中“更稳定”部分(即在 _maint_、_master_ 和 _next_ 等分支上)的另一个提交,有几个原因:

  1. 引入了你正在修复的错误的根本原因的提交。

  2. 引入了你正在增强的功能的提交。

  3. 你在将你的工作试探性合并到 _next_ 和 _seen_ 进行测试时,与你的工作发生冲突的提交。

当你引用一个更稳定分支(如 _master_、_maint_ 和 _next_)上的提交时,请使用“缩写哈希(主题,日期)”格式,如下所示:

	Commit f86a374 (pack-bitmap.c: fix a memleak, 2015-03-30)
	noticed that ...

gitk 的“复制提交引用”命令可以用于获取此格式(主题用双引号括起来),或者调用 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 尾部来认证你的工作

为了改进跟踪谁做了什么,我们要求你通过“签署”你的补丁来认证你编写了该补丁或有权在与我们相同的许可证下分发它。没有签署,我们就无法接受你的补丁。

如果你(并且仅当你)认证以下 D-C-O

开发者起源证明 1.1

通过向本项目贡献,我证明:

  1. 该贡献是由我全部或部分创建的,并且我有权根据文件中指明的开源许可证提交它;或

  2. 该贡献基于我所知的、受适当开源许可证保护的先前工作,并且根据该许可证,我有权(除非被允许以不同的许可证提交)以相同开源许可证(包括由我全部或部分创建的修改)提交该工作,如文件中所示;或

  3. 该贡献是由其他人直接提供给我的,该其他人已证明 (a), (b) 或 (c),并且我未对其进行修改。

  4. 我理解并同意本项目和该贡献是公开的,并且贡献的记录(包括我提交的所有个人信息,包括我的签名)将被无限期维护,并可能根据本项目或所涉及的开源许可证进行重新分发。

你会在你的提交中添加一个“Signed-off-by”尾部,它看起来像这样:

	Signed-off-by: Random J Developer <random@developer.example.org>

如果你使用 -s 选项运行 git-commit 命令,Git 会自动添加这一行。

请注意,根据上述 D-C-O 规则,在转发展其他人的补丁时,你也可以添加自己的 Signed-off-by 尾部。事实上,我们鼓励这样做。不要忘记在正文中添加一个“From: ”行,以正确地将更改归因于其真正的作者(参见上面的 (2))。

此程序最初来自 Linux 内核项目,因此我们的规则与之非常相似,但签署你的补丁的确切含义因项目而异,所以可能与你习惯的项目不同。

请在 Signed-off-by 尾部使用已知的身份,因为我们无法接受匿名贡献。使用你真实姓名的某种形式很常见,但并非强制要求。我们认识到有些贡献者对此感到不舒服,或者更喜欢以化名或首选名称贡献,我们可以接受你的补丁,只要你使用的姓名和电子邮件是独特、可识别且不具误导性的。

此政策的目标是使我们拥有足够的信息,以便在出现关于你贡献的问题时能够联系到你。

如果你愿意,可以在末尾添加额外的尾部:

  1. Reported-by: 用于表彰发现补丁试图修复的错误的人。

  2. Acked-by: 表示对补丁所修改的区域更熟悉的人喜欢这个补丁。

  3. Reviewed-by: 与其他尾部不同,只能由审查者在对补丁进行详细分析并完全满意后提供。

  4. Tested-by: 用于表明某人应用了补丁并发现它产生了预期效果。

  5. Co-authored-by: 用于表示人们在提交补丁之前交换了补丁草稿。

  6. Helped-by: 用于表彰那些在不提供具体补丁形式的情况下提出更改想法的人。

  7. Mentored-by: 用于表彰那些作为指导计划(例如 GSoC 或 Outreachy)的一部分帮助开发补丁的人。

  8. Suggested-by: 用于表彰那些提出补丁想法的人。

虽然在情况需要时你也可以创建自己的尾部,但我们鼓励你使用上面突出显示的此项目中的常用尾部之一。

只将尾部的第一个字母大写,即偏好“Signed-off-by”而不是“Signed-Off-By”,以及“Acked-by:”而不是“Acked-By”。

人工智能 (AI) 的使用

开发者起源证明要求贡献者证明他们知道其贡献的来源,并且他们有权在项目的许可证下提交它。当提交大量由 AI 工具生成的内容时,尚不清楚这是否能在法律上满足要求。

AI 生成内容的另一个问题是,AI 仍然经常会产生幻觉或仅仅产生不好的代码、提交消息、文档或输出,即使你指出了它们的错误。

为了避免这些问题,我们将拒绝任何看起来是 AI 生成的、听起来过于正式或冗长、看起来像 AI 垃圾、表面上看起来不错但没有意义,或者发送者不理解或无法解释的内容。

我们强烈建议谨慎负责地使用 AI 工具。

贡献者通过使用 AI 来指导和帮助他们逐步自行完成解决方案,而不是要求一个他们然后大部分复制粘贴的完整解决方案,从而受益更多。他们还可以使用 AI 来帮助调试,或者检查明显的错误、可以改进的地方、不符合我们的风格、指南或反馈的地方,然后再发送给我们。

使用 Git 工具从你的提交中生成补丁。

基于 Git 的 diff 工具生成 unidiff,这是首选格式。

如果你的补丁涉及文件重命名,你无需担心使用 git diffgit 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-patchsend-email

如果可能,请学习使用 format-patchsend-email。这些命令针对发送补丁的工作流程进行了优化,避免了你现有的电子邮件客户端(通常针对“multipart/*”MIME 类型电子邮件进行了优化)可能使你的补丁无法使用的许多方式。

注意
这里我们概述了使用 format-patchsend-email 的流程,但你也可以使用 GitGitGadget 来发送你的补丁(参见 MyFirstContribution)。

Git 邮件列表上的人们需要能够阅读和评论您提交的更改。开发者能够使用标准的电子邮件工具“引用”您的更改,以便他们可以评论您代码的特定部分,这一点非常重要。因此,每个补丁都应该“内联”提交到一个单独的消息中。

补丁系列的所有后续版本和其他相关补丁都应该分组到自己的电子邮件主题中,以帮助读者找到该系列的所有部分。为此,请将它们作为回复发送,回复对象可以是额外的“封面信”(见下文)、第一个补丁或 respective preceding patch。以下是有关如何提交补丁系列更新版本的分步指南

如果您的日志消息(包括您在Signed-off-by尾注中的姓名)无法用 ASCII 字符书写,请确保您使用正确的编码发送消息。

警告
请注意您的 MUA(邮件用户代理)的自动换行可能会损坏您的补丁。不要复制粘贴您的补丁;如果您不小心,可能会丢失制表符。

在主题行前加上 [PATCH] 是一个常见的约定。这让人们可以轻松地区分补丁和其他电子邮件讨论。还鼓励在方括号中使用除 PATCH 之外的标记来描述补丁的性质。例如,[RFC PATCH](其中 RFC 代表“征求意见”)通常用于表示补丁在被接受之前需要进一步讨论,而 [PATCH v2]、[PATCH v3] 等通常在您发送先前发送内容的更新时使用。

git format-patch 命令遵循最佳实践来格式化电子邮件消息的正文。在补丁的开头应该是您的提交消息,以Signed-off-by尾注结束,然后是一行由三个破折号组成,后面跟着 diffstat 信息和补丁本身。如果您转发他人的补丁,可以选择在电子邮件消息的开头,在提交消息开始之前,放置一个“From: ”行来命名该人。要将主题中的默认“[PATCH]”更改为“[<text>]”,请使用git format-patch --subject-prefix=<text>。作为快捷方式,您可以使用--rfc代替--subject-prefix="RFC PATCH",或使用-v <n>代替--subject-prefix="PATCH v<n>"

您通常想在提交消息本身之外添加有关补丁的额外解释。将此类“封面信”材料放在三破折号行和 diffstat 之间。对于需要多轮审查和讨论的补丁,可以在每次迭代之间的更改说明保存在 Git-notes 中,并通过git format-patch --notes自动插入到三破折号行之后。

这是实验性的.

当发送一个主题时,您可以选择性地提出一个主题名称和/或一段摘要,该摘要应出现在“正在进行的开发”报告中,用于解释该主题。如果您选择这样做,请写一个 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 消息。那不是 text/plain,而是其他东西。

处理冲突和迭代补丁

在修改您的补丁时,承认与其他正在进行的开发主题可能发生冲突的可能性非常重要。为了有效地处理这些潜在的冲突,请遵循下面概述的推荐步骤

  1. 建立在合适的基分支上,请参阅上面的部分,然后格式化补丁系列。如果您正在就地进行“rebase -i”来更新上一轮,这将重用之前的基,因此(2)和(3)可能会变得微不足道。

  2. 找到上一轮被排队的基

    $ mine='kn/ref-transaction-symref'
    $ git checkout "origin/seen^{/^Merge branch '$mine'}...master"
  3. 应用您的 format-patch 结果。有两种情况

    1. 一切都干净地应用并且测试通过。转到(4)。

    2. 一切都干净地应用,但构建失败或测试失败,或者根本不干净地应用。

      在后一种情况下,您会遇到文本冲突或语义冲突,这些冲突来自于旧基与您在(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)。

  4. 将您的主题与nextseen进行试合并,例如

    $ 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获取的依赖主题之上准备了一个基,那么这应该不会发生冲突。除非情况严重(一种判断方法是尝试使用旧迭代进行相同的试合并,这可能会以类似的方式发生冲突),否则预计这将在维护者端处理(如果变得无法管理,当我收到您的补丁时,我会要求 rebasing)。

具有专用维护者的子系统

系统的一些部分有专门的维护者,他们有自己的存储库。

  • 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/

这些部分的补丁应基于他们的树。

  • “Git 文档翻译”项目,由 Jean-Noël Avila 领导,负责翻译我们的文档页面。他们的工作产品与该项目分开维护,不属于我们的树。

    https://github.com/jnavila/git-manpages-l10n/

GitHub CI

通过 GitHub 账户,您可以使用 GitHub CI 在 Linux、Mac 和 Windows 上测试您的更改。请参阅https://github.com/git/git/actions/workflows/main.yml 获取近期 CI 运行示例。

按照以下步骤进行初始设置

  1. https://github.com/git/git Fork 到您的 GitHub 账户。您可以在此处找到有关如何 Fork 的详细说明:https://help.github.com/articles/fork-a-repo/

初始设置后,每当您将新更改推送到您 Fork 的 Git 存储库到 GitHub 时,CI 都会运行。您可以在此处监控所有分支的测试状态:https://github.com/<Your GitHub handle>/git/actions/workflows/main.yml

如果一个分支未能通过所有测试用例,它将被标记为一个红色的x,而不是一个绿色的勾号。在这种情况下,您可以点击失败的作业并导航到“ci/run-build-and-tests.sh”和/或“ci/print-test-failures.sh”。您还可以下载“Artifacts”,这些是 zip 存档,其中包含用于调试的测试数据的 tar(或 zip)存档。

然后修复问题并将您的修复推送到您的 GitHub Fork。这将触发新的 CI 构建,以确保所有测试都通过。

MUA 特定提示

我收到或从邮件列表中提取的一些补丁存在常见的损坏模式。请确保您的 MUA 设置正确,不会损坏空格。

请参阅git-format-patch[1] 的DISCUSSION部分,了解如何通过将补丁邮寄给自己并使用git-am[1] 进行应用来检查您的补丁。

在进行此操作时,请检查试用应用补丁后产生的提交日志消息。如果提交中的内容与您希望看到的内容不完全一致,那么您的维护者很可能会在应用您的补丁时手动编辑日志消息。诸如“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 部分。

Gnus

*Summary*缓冲区中的“|”可以将当前消息通过管道传输到外部程序,这是驱动git am的便捷方法。但是,如果消息是 MIME 编码的,则通过管道传输到程序的是您在*Article*缓冲区中解开 MIME 后看到的表示。这通常不是您想要的,原因有两个。它倾向于搞砸非 ASCII 字符(最明显的是人名),以及空格(在补丁中是致命的)。运行“C-u g”以原始形式显示消息,然后再使用“|”来运行管道,可以解决这个问题。


1. Git 安全邮件列表:git-security@googlegroups.com
2. `contrib/` 下的脚本不是核心 `git` 二进制文件的一部分,必须直接调用。克隆 Git 代码库并运行 `perl contrib/contacts/git-contacts`。
3. 当前维护者:gitster@pobox.com
4. 邮件列表:git@vger.kernel.org