Git
English ▾ 主题 ▾ 最新版本 ▾ SubmittingPatches 最后更新于 2.46.0

指南

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

补丁系列的典型生命周期

为了帮助我们理解稍后文档中给出的各种指南背后的原因,首先让我们了解一下本项目的典型补丁系列的生命周期。

  1. 您想解决一个问题。您编写了代码。您无需事先获得项目的任何授权即可执行此操作。

    您的补丁将由邮件列表中的其他贡献者审查,审查将用于评估各种事项的价值,例如补丁背后的总体思路(包括“它是否首先解决了值得解决的问题?”),解决方案的设计原因以及实际的实现。此处提供的指南旨在通过使审阅者更容易理解您的补丁来帮助您的补丁。

  2. 您将补丁发送到列表并抄送可能需要了解更改的人员。您的目标**并非**一定要说服其他人您正在构建的内容是好的。您的目标是在想出解决“问题”的方案方面获得帮助,该方案比您单独构建的方案更好。

    可能需要知道的人员是处理您正在修改的代码的人员。这些人恰好是最有可能有足够知识帮助您的人,但他们没有义务帮助您(即您请求他们提供帮助,而不是要求)。git log -p -- $area_you_are_modifying 将帮助您找出他们是谁。

  3. 您会收到意见和改进建议。您甚至可能会以“在您的更改之上”补丁的形式获得它们。您应在邮件列表中使用“回复所有人”回复它们,同时在准备更新的补丁集时将它们考虑在内。

  4. 完善、改进并重新将您的补丁发送到列表和花费时间改进您的补丁的人员。返回步骤 (2)。

  5. 虽然上述迭代改进了您的补丁,但维护者可能会从列表中获取补丁并将其排队到seen分支,以便让人们更容易使用它,而无需自己获取和应用补丁到他们的树中。处于seen状态没有任何其他含义。具体来说,它并不意味着补丁以任何方式被“接受”。

  6. 当讨论达成共识,认为补丁的最新迭代已足够完善时,维护者将该主题包含在每周发送几次到邮件列表的“正在准备中”报告中,并标记为“将合并到next”。此决定主要由维护者在参与审查讨论的人员的帮助下做出。

  7. 在补丁合并到next分支后,讨论仍可以继续改进它们,并在其之上添加更多补丁,但当主题合并到next时,预计每个人都同意该主题的范围和基本方向是合适的,因此此类增量更新仅限于小的更正和改进。在某个主题在next中停留一段时间(例如 7 个日历日)并且无需在顶部进行进一步调整后,它将合并到master分支并等待成为下一个主要版本的组成部分。

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

选择起点。

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

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

  • maint

  • master

  • next

  • seen

列表中较低的分支通常是其前面分支的后代。例如,maint 是比master“更旧”的分支,因为master 通常在maint之上有补丁(提交)。

还有“主题”分支,其中包含来自其他贡献者的工作。主题分支由 Git 维护者(在其 fork 中)创建,以组织邮件列表中当前传入的贡献集,并在常规的“Git.git 中正在准备什么”公告中逐条列出。要查找主题分支的顶端,请运行git log --first-parent master..seen并查找合并提交。此提交的第二个父级是主题分支的顶端。

选择正确起点有一个指导原则:一般来说,始终以与您的更改相关的最旧的集成分支为基础(请参阅 gitworkflows[7] 中的“向上合并”)。此原则意味着在绝大多数情况下,新工作的起点应基于以下情况,以maintmaster的最新 HEAD 提交为基础

  • 如果您要修复已发布版本中的错误,请使用maint作为起点(这可能意味着您必须在不使用最近出现在master中但在已发布版本中不可用的尖端新 API 功能的情况下修复问题)。

  • 否则(例如,如果您要添加新功能),请使用master

注意
在特殊情况下,旧版本中引入的错误可能需要针对比最近版本旧得多的版本的使用者进行修复。对于引入错误的提交Xgit describe --contains X可能会将X描述为v2.30.0-rc2-gXXXXXX,并且错误的影响可能非常大,以至于当“Git 2.41.0”是当前版本时,我们可能需要为 Git 2.30.x 系列发布新的维护版本。在这种情况下,您可能希望使用 2.30.x 系列的维护分支的顶端,该分支可能在 维护者的“分离”存储库 中的maint-2.30分支中可用。

这也意味着,如果您希望您的工作有现实的机会晋升到master,则nextseen不适合作为您工作的起点。它们的设计并非用于用作新工作的基础;它们仅仅是为了确保正在进行的主题能够很好地协同工作。这就是为什么nextseen经常与邮件列表中的传入补丁重新集成并强制推送以替换其先前版本的原因。从字面上构建在next之上的主题无法合并到master,而无需拖入next中的所有其他主题,其中一些主题可能尚未准备好。

例如,如果您正在进行全树范围的更改,而其他人也正在进行自己的全树范围的更改,那么您的工作可能与其他人的工作有严重的重叠。这种情况可能会诱惑您使用next作为起点(因为它将包含其他人的工作),但这样做意味着您不仅依赖于其他人的工作,还依赖于已集成到next中的其他贡献者的所有随机内容。并且,一旦next更新为新版本,无论如何都需要重新设置所有工作的基础,以便维护者能够干净地应用它们。

在极少数特殊情况下,如果您绝对必须依赖一些已经在next分支但未在master分支中的主题分支,则可以考虑通过复制master分支并将其所需主题分支合并到其中来创建您自己的自定义基础分支。然后,您可以在此基础分支之上进行工作。但请记住,此基础分支仅为您个人所知。因此,当您准备好将补丁发送到列表时,请务必在您的附信中说明您是如何创建它的。此关键信息将允许其他人根据您的说明在他们自己的环境中重新创建您的基础分支,以便他们尝试您的工作。

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

对于逻辑上独立的更改,请分别提交。

除非您的补丁非常简单,否则您不应发送在工作树和提交头部之间生成的补丁。相反,始终使用完整的提交消息进行提交,并从您的存储库生成一系列补丁。这是一个良好的习惯。

提供对更改的解释,其详细程度足以让人们判断这是否是件好事,而无需阅读实际的补丁文本以确定代码是否按解释承诺的那样工作。

如果您的描述开始变得太长,则表示您可能需要将提交拆分为更细粒度的部分。话虽如此,清晰描述有助于审查者检查补丁以及未来维护者理解代码的补丁是最漂亮的补丁。能够在主题中很好地概括要点,并描述更改的动机、更改采用的方法,以及如果相关,此更改与先前版本有何重大区别的描述,都是很好的内容。

确保您为要修复的错误编写了测试。有关指导,请参阅t/README

添加新功能时,请确保您有新的测试来展示该功能在应该触发时触发新的行为,并在不应该触发时不触发。在进行任何代码更改后,请确保整个测试套件都通过。修复错误时,请确保您有新的测试,如果其他人意外地破坏了您修复的内容,这些测试会中断,以避免出现回归。此外,尝试将您的工作合并到nextseen中,并确保测试仍然通过;其他人的主题如果仍在进行中,可能会与您在主题中尝试执行的操作产生意外的交互。

推送到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也说得通?”。说“我们不对文件执行相同的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出现在句子的中间,我们也将其全部大写。

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

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

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

  3. 考虑但已放弃的备选方案(如果有)。

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

以祈使语气描述您的更改,例如“使xyzzy执行frotz”,而不是“[此补丁]使xyzzy执行frotz”或“[我]更改了xyzzy以执行frotz”,就好像您正在命令代码库更改其行为一样。尽量确保您的解释可以在没有外部资源的情况下被理解。不要提供邮件列表存档的URL,而是总结讨论的相关要点。

您可能希望在历史记录的“更稳定”部分(即在maintmasternext等分支上)引用另一个提交,原因如下:

  1. 引入您要修复的错误根本原因的提交。

  2. 引入您要增强功能的提交。

  3. 当您将工作试合并到nextseen中进行测试时,与您的工作发生冲突的提交。

当您引用更稳定分支(如mastermaintnext)上的提交时,请使用“简写哈希(主题,日期)”格式,如下所示:

	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 <[email protected]>

如果您使用 `git-commit` 命令并添加 `-s` 选项,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”。

使用 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-patchsend-email

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

注意
这里我们概述了使用 `format-patch` 和 `send-email` 的过程,但您也可以使用 GitGitGadget 发送补丁(请参阅 MyFirstContribution)。

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

补丁系列的所有后续版本和其他相关补丁应分组到它们自己的电子邮件线程中,以帮助读者找到系列的所有部分。为此,请将它们作为对其他“附信”消息(见下文)、第一个补丁或相应的先前补丁的回复发送。这是一个关于如何提交补丁系列更新版本的 分步指南

如果您的日志消息(包括 `Signed-off-by` 尾部信息中的姓名)无法用 ASCII 编写,请确保您以正确的编码发送消息。

警告
注意您的邮件用户代理的自动换行是否破坏了您的补丁。不要剪切粘贴您的补丁;如果您不小心,可能会丢失制表符。

常见的约定是在您的主题行前加上 [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` 自动插入三个破折号行之后。

这是实验性的.

发送主题时,您可以提议一段摘要,当它被选取时,该摘要应出现在“What’s cooking”报告中,以解释主题。如果您选择这样做,请撰写一个 2-5 行的段落,使其适合我们的发行说明(请参阅 Documentation/RelNotes/* 文件中的许多项目符号条目以获取示例),并将其作为附信的第一段。对于单补丁系列,请使用三个破折号行和 diffstat 之间的空间,如前所述。

不要将补丁作为 MIME 附件附加,无论是否压缩。不要让您的电子邮件客户端发送 Quoted-printable。不要让您的电子邮件客户端发送 format=flowed,这会破坏补丁中的空白字符。许多流行的电子邮件应用程序不会始终将 MIME 附件作为纯文本传输,这使得无法评论您的代码。MIME 附件也需要更多时间进行处理。这不会降低您的 MIME 附加更改被接受的可能性,但会增加其被推迟的可能性。

例外:如果您的邮件程序正在破坏补丁,则有人可能会要求您使用 MIME 重新发送它们,这是可以的。

不要用 PGP 对您的补丁进行签名。很可能,您的维护者或列表中的其他人没有您的 PGP 密钥,也不会费心去获取它。您的补丁不是根据您是谁来评判的;来自未知来源的良好补丁比来自已知、受尊敬的来源但做得不好或做错事的补丁更有可能被接受。

如果您真的真的真的非常想进行 PGP 签名补丁,请将其格式化为“multipart/signed”,而不是以 `-----BEGIN PGP SIGNED MESSAGE-----` 开头的纯文本消息。这不是纯文本,而是其他东西。

处理冲突和迭代补丁

在修改对补丁所做的更改时,务必承认与其他正在进行的主题发生冲突的可能性。为了有效地解决这些潜在的冲突,请遵循以下建议的步骤

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

  2. 找到上一轮排队的位置的基。

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

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

具有专用维护者的子系统

系统的一些部分有专门的维护者及其自己的存储库。

  • git-gui/ 来自 git-gui 项目,由 Johannes Sixt 维护

    https://github.com/j6t/git-gui
  • gitk-git/ 来自 Paul Mackerras 的 gitk 项目

    git://git.ozlabs.org/~paulus/gitk
    Those who are interested in improving gitk can volunteer to help Paul
    maintain it, cf. <YntxL/fTplFm8lr6@cleo>.
  • 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

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

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

初始设置完成后,每当您将新的更改推送到您在 GitHub 上的 Git 分支时,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”,它们是包含 tarred(或 zipped)归档文件的 zip 档案,其中包含与调试相关的测试数据。

然后修复问题并将您的修复程序推送到您的 GitHub 分支。这将触发新的 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 <[email protected]>
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 编码的,则传递到程序中的内容是在解包 MIME 后在 *Article* 缓冲区中看到的内容。由于两个原因,这通常不是您想要的。它往往会弄乱非 ASCII 字符(最显着的是人名),以及空格(在补丁中是致命的)。在使用“|”运行管道之前,运行“C-u g”以原始形式显示消息可以解决此问题。


1。Git 安全邮件列表:[email protected]
2contrib/ 下的脚本不是核心 git 二进制文件的一部分,必须直接调用。克隆 Git 代码库并运行 perl contrib/contacts/git-contacts
3。当前维护者:[email protected]
4。邮件列表:[email protected]
scroll-to-top