设置和配置
获取和创建项目
基本快照
分支与合并
共享和更新项目
检查和比较
打补丁
调试
电子邮件
外部系统
服务器管理
指南
管理
底层命令
- 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 用户的必读内容。
指南
以下是为此项目贡献的一些指南。另有一个分步教程,涵盖了许多相同的指南。
补丁系列的一个典型生命周期
为了帮助我们理解文档后面给出的各种指南背后的原因,首先让我们了解此项目典型补丁系列的生命周期是怎样的。
-
你产生了一个想法/需求。你将其编写成代码。你不需要项目的任何预先授权即可这样做。
你的补丁将由邮件列表上的其他贡献者进行审查,审查将评估各种事项的价值,例如你补丁背后的总体思想(包括“这是否首先解决了值得解决的问题?”)、解决方案设计的原因以及实际的实现。此处给出的指南旨在通过使你的补丁更容易被审阅者理解来帮助它们。
-
你将补丁发送到列表中,并抄送可能需要了解此更改的人。你的目标不一定是说服他人你正在构建的东西是好的。你的目标是获得帮助,为“痛点”提出一个比你独自构建的更好的解决方案。
可能需要了解的人是那些处理你正在修改的代码的人。这些人碰巧是最有可能具备足够知识来帮助你的人,但他们没有义务帮助你(即,你请求他们的帮助,而不是要求)。
git
log
-p
--
$area_you_are_modifying
将帮助你找出他们是谁。 -
你会收到改进的评论和建议。你甚至可能以“在你的更改之上”的补丁形式收到它们。你需要在邮件列表上使用“回复全部”来回应,同时在准备更新的补丁集时将其考虑在内。
-
润色、改进,然后将你的补丁重新发送到列表以及那些花费时间改进你补丁的人。回到步骤(2)。
-
虽然上述迭代会改进你的补丁,但维护者可能会从列表中选取补丁并将其排队到
seen
分支,以便人们更容易地使用它,而无需自行选取并应用补丁到他们的工作树中。在seen
中没有其他含义。具体来说,这并不意味着补丁以任何方式“被接受”。 -
当讨论达成共识,认为补丁的最新迭代已足够完善时,维护者会将该主题包含在每周几次发送到邮件列表的“正在进行中”(What's cooking)报告中,并标记为“将合并到 next”。这一决定主要由维护者在参与审查讨论的人的帮助下做出。
-
补丁合并到 next 分支后,讨论仍然可以通过在其之上添加更多补丁来进一步改进它们,但当一个主题合并到 next 时,预计所有人都同意该主题的范围和基本方向是适当的,因此此类增量更新仅限于小的修正和润色。当一个主题在 next 中“酝酿”一段时间(例如7个日历日)而无需进一步调整后,它将合并到 master 分支并等待成为下一个主要版本的一部分。
在以下各节中,列出了许多技术和约定,以帮助你的补丁在此类生命周期中获得有效审查。
选择一个起点。
作为初步步骤,你必须首先选择你工作的起点。通常这意味着选择一个分支,尽管从技术上讲,它实际上是一个特定的提交(通常是分支的 HEAD 或尖端)。
有几个重要的分支需要注意。即,gitworkflows[7] 中讨论了四个集成(integration)分支
-
maint
-
master
-
next
-
seen
列表中靠后的分支通常是其前面分支的后代。例如,maint
是比 master
“更旧”的分支,因为 master
通常包含在 maint
之上的补丁(提交)。
还有“主题”分支(topic branches),其中包含其他贡献者的工作。主题分支由 Git 维护者(在其派生仓库中)创建,用于组织邮件列表中当前收到的贡献集,并在定期发布的“git.git 正在进行中”公告中列出。要查找主题分支的尖端(tip),运行 git
log
--first-parent
master..seen
并查找合并提交。此提交的第二个父提交是主题分支的尖端。
选择正确起点有一条指导原则:通常,你的工作应始终基于与你的更改相关的最旧的集成(integration)分支(参见 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
并将所需的主题分支合并到其中来创建自己的自定义基础分支。然后你可以在这个基础分支之上进行工作。但请记住,这个基础分支只对你私有。因此,当你准备将补丁发送到列表时,请务必在你的附函中说明你是如何创建它的。这一关键信息将允许他人在他们那边重新创建你的基础分支,以便他们尝试你的工作。
最后,请注意系统的某些部分有专门的维护者,他们拥有自己的独立源代码仓库(参见下面的“子系统”部分)。
为逻辑上独立的更改创建单独的提交。
除非你的补丁确实微不足道,否则你不应该发送工作树和提交头之间生成的补丁。相反,始终创建一个包含完整提交消息的提交,并从你的仓库生成一系列补丁。这是一种良好的规范。
为更改提供足够详细的解释,以便人们可以在不阅读实际补丁文本的情况下判断它是否是件好事,以确定代码是否很好地实现了解释所承诺的功能。
如果你的描述开始变得太长,这表明你可能需要将提交拆分为更细粒度的部分。话虽如此,那些清晰描述有助于审阅者检查补丁和未来维护者理解代码的事项的补丁,是最美观的补丁。在主题中很好地总结要点,并描述更改的动机、更改所采取的方法,以及(如果相关)这与先前版本有何实质性不同的描述,都是值得拥有的好东西。
确保你为正在修复的 bug 编写了测试。请参阅 t/README
获取指导。
添加新功能时,请确保你有新的测试来显示该功能在应该触发时触发新行为,并在不应该触发时未触发。任何代码更改后,请确保整个测试套件通过。修复错误时,请确保你有新的测试,如果其他人意外破坏了你修复的内容,这些测试会失败,以避免回归。此外,尝试将你的工作合并到 next 和 seen,并确保测试仍然通过;其他仍在进行中的主题可能会与你正在尝试在你的主题中做的事情产生意想不到的交互。
推送到 https://github.com/git/git 的派生仓库将使用其 CI 集成来在 Linux、Mac 和 Windows 上测试你的更改。有关详细信息,请参阅 GitHub CI 部分。
不要忘记更新文档以描述更新后的行为,并确保生成的文档集格式良好(尝试 Documentation/doc-diff 脚本)。
我们目前对拼写和语法采用了美国英语和英国英语规范的自由混合,这多少有些不幸。然而,一个仅仅为了纠正不一致性而触及所有文件的巨大补丁是不受欢迎的。此类补丁可能与其他更改产生潜在冲突,不值得。我们倾向于通过小型且易于理解的补丁,在附近进行其他实际工作的同时(例如,为了清晰度重写一个段落,同时将英式拼写改为美式拼写),逐步地使不一致性与美式英语保持一致。明显的印刷错误修正(“teh” → “the”)更受欢迎,最好作为独立于其他文档更改的补丁提交。
哦,还有一件事。我们对空白字符很挑剔。确保你的更改不会触发 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
出现在句中,我们也将其全大写。
正文应提供有意义的提交消息,其中:
-
解释更改试图解决的问题,即在没有更改的情况下当前代码有什么问题。
-
说明更改解决问题的方式是合理的,即为什么更改后的结果更好。
-
(如果存在)考虑过但已放弃的备选方案。
描述现状的问题陈述应使用现在时态。写“代码在给定输入 Y 时执行 X”,而不是“代码在给定输入 X 时曾执行 Y”。你不需要说“当前”——根据项目约定,问题陈述中的现状指的是没有你的更改的代码。
以祈使语气描述你的更改,例如,“使 xyzzy 执行 frotz”而不是“[此补丁]使 xyzzy 执行 frotz”或“[我]更改了 xyzzy 以执行 frotz”,就好像你在命令代码库改变其行为一样。尝试确保你的解释无需外部资源即可理解。不要提供邮件列表存档的 URL,而是总结讨论的相关要点。
在历史中“更稳定”的部分(即在 maint
、master
和 next
等分支上)引用另一个提交有几个原因:
-
引入你正在修复的 bug 根本原因的提交。
-
引入你正在增强的功能的提交。
-
当你的工作在尝试合并到
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
尾行来认证你的工作
为了更好地追踪谁做了什么,我们要求你通过“签署”("signing off")你的补丁来证明你编写了该补丁,或者有权在与我们相同的许可下传递它。没有签署,我们无法接受你的补丁。
如果(且仅当)你认证以下 D-C-O
通过对本项目做出贡献,我证明:
本贡献由我全部或部分创建,并且我有权根据文件中指明的开源许可提交它;或
本贡献基于我所知,受适当开源许可覆盖的先前工作,并且我有权根据该许可提交包含修改的工作(无论是否由我全部或部分创建),遵循文件中指明的相同开源许可(除非我被允许根据不同的许可提交);或
本贡献由其他已认证 (a)、(b) 或 (c) 的人直接提供给我,并且我未对其进行修改。
我理解并同意本项目和此贡献是公开的,并且贡献记录(包括我提交的所有个人信息,包括我的签署)将无限期地保留,并可以根据本项目或所涉及的开源许可进行再分发。
你将一个“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
尾行中使用了真实姓名。请不要隐藏你的真实姓名。
如果你愿意,可以在末尾添加额外的尾行
-
Reported-by:
用于注明发现补丁试图修复的 bug 的人。 -
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”。
使用 Git 工具从你的提交中生成补丁。
基于 Git 的差异工具生成 unidiff 格式,这是首选格式。
如果你的补丁涉及文件重命名,你无需害怕对 git
diff
或 git
format-patch
使用 -M
选项。接收方可以很好地处理它们。
请确保你的补丁没有添加被注释掉的调试代码,或包含任何与你的补丁旨在实现的功能无关的额外文件。生成补丁后务必进行审查,以确保准确性。在发送之前,请确保它能干净地应用到你在“选择一个起点”部分选择的起点。
注意
|
从审查你补丁的人的角度来看,master 分支是默认的预期起点。因此,如果你选择了不同的起点,请在你的附函中说明这一选择。 |
发送你的补丁。
选择你的审阅者
注意
|
可能与安全相关的补丁应私下提交给 Git 安全邮件列表[1],而不是公开邮件列表。 |
发送补丁时,将“收件人”(To:)设置为邮件列表,并将“抄送”(cc:)列出与你正在修改的区域相关的人(contrib/contacts/
[2] 中的 git-contacts
脚本可以帮助识别他们),以征求评论和审查。此外,当你将你的主题试合并到 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:
等尾行,以感谢帮助你补丁的人,并在发送此类最终版本以供收录时“抄送”他们。
format-patch
和 send-email
如果可能,学习使用 format-patch
和 send-email
。这些命令已针对发送补丁的工作流程进行了优化,避免了你现有的电子邮件客户端(通常针对“multipart/*”MIME 类型电子邮件进行优化)可能导致你的补丁无法使用的许多方式。
注意
|
这里我们概述了使用 format-patch 和 send-email 的流程,但你也可以使用 GitGitGadget 发送你的补丁(参见 MyFirstContribution)。 |
Git 邮件列表中的人需要能够阅读和评论你提交的更改。对于开发人员来说,能够使用标准电子邮件工具“引用”你的更改以便他们可以评论你的代码的特定部分非常重要。因此,每个补丁都应该作为单独消息的“内联”提交。
补丁系列的所有后续版本及其他相关补丁应归入其各自的电子邮件线程,以帮助读者找到系列的所有部分。为此,请将它们作为对附加“附函”消息(见下文)、第一个补丁或相应的先前补丁的回复发送。这里有一个分步指南,说明如何提交补丁系列的更新版本。
如果你的日志消息(包括 Signed-off-by
尾行中的姓名)无法用 ASCII 写入,请确保你以正确的编码发送消息。
警告
|
警惕你的 MUA(邮件用户代理)的自动换行功能破坏你的补丁。不要剪切粘贴你的补丁;如果你不小心,可能会因此丢失制表符。 |
通常,在邮件主题行前加上 `[PATCH]` 是一个惯例。这使得人们可以轻松区分补丁和其他电子邮件讨论。也鼓励在方括号内除了 `PATCH` 之外使用其他标记来描述补丁的性质。例如,`[RFC PATCH]`(其中 RFC 代表“征求意见”)通常用于表示补丁在被接受之前需要进一步讨论,当你发送之前已发送内容的更新时,经常会看到 `[PATCH v2]`、`[PATCH v3]` 等。
git
format-patch
命令遵循当前最佳实践来格式化电子邮件正文。补丁的开头应该是你的提交消息,以 Signed-off-by
尾行结束,然后是一行由三个破折号组成,接着是 `diffstat` 信息和补丁本身。如果你正在转发别人的补丁,可以在电子邮件消息开头、提交消息开始之前,选择性地添加一个“From: ”行来注明该人的姓名。要将主题中默认的“[PATCH]”更改为“[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-----
开头的纯文本消息。那不是纯文本,而是其他东西。
处理冲突和迭代补丁
在修订你的补丁所做的更改时,承认与其他正在进行的主题可能存在的冲突非常重要。为了有效处理这些潜在冲突,请遵循下面概述的建议步骤:
-
在一个合适的基础分支上构建,参见上文,并对系列进行 `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/
来自本地化协调员姜鑫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 账户。你可以在这里找到如何派生的详细说明: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”(工件),它们是包含打包(或压缩)的测试数据的 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 <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 部分。