PEP 512 – 从 hg.python.org 迁移到 GitHub
- 作者:
- Brett Cannon <brett at python.org>
- 讨论至:
- 核心工作流列表
- 状态:
- 最终版
- 类型:
- 流程
- 创建日期:
- 2015年1月17日
- 发布历史:
- 2016年1月17日,2016年1月19日,2016年1月23日
注意
CPython 的开发流程已于 2017 年 2 月 10 日迁移到 https://github.com/python/cpython。
摘要
本 PEP 概述了将 Python 的开发流程从 Mercurial [3] (托管于 hg.python.org [1]) 迁移到 GitHub [2] 上的 Git [4] 所需的步骤。满足本 PEP 的最低目标应能使 Python 的开发流程保持现有生产力,而满足其扩展目标则应能改善其开发流程现状。
基本原理
2014 年,Python 自定义开发流程的弊端日益明显。例如,对于外部贡献者提交一个最终被合并的错误修复,基本步骤如下:
- 在 bugs.python.org [5] 上为该错误打开一个问题。
- 从 hg.python.org [1] 检出 CPython 源代码。
- 进行修复。
- 上传补丁。
- 由核心开发者使用我们分叉的 Rietveld 代码审查工具 [6] 审查补丁。
- 下载补丁以确保其仍然干净地应用。
- 手动运行测试套件。
- 根据需要更新
NEWS、ACKS和“What's New”文档。 - 拉取更改以避免合并竞争。
- 手动提交更改。
- 如果更改用于错误修复版本,则合并到开发中的分支。
- 再次手动运行测试套件。
- 提交合并。
- 推送更改。
这对于核心开发者来说是一个非常繁重的手动过程。即使在简单的情况下,你也只能跳过代码审查步骤,因为你仍然需要构建文档。这导致补丁在问题跟踪器上积压,因为核心开发者无法足够快地处理积压,跟不上提交。反过来,这导致了一个副作用问题,即由于缺乏关注而导致外部贡献者的沮丧,从而阻碍了外部贡献,这对于一个没有公司支持的开源项目来说是一个危险的问题,因为它与项目的可行未来背道而驰。虽然允许将补丁上传到 bugs.python.org [5] 对外部贡献者来说可能很简单,但对于核心开发者来说,它的工作效率是极其缓慢和繁重的。
因此,在 2014 年底,做出了需要转向新开发流程的决定。发出了征集提出新工作流的 PEP 的请求,最终产生了两个:PEP 481 和PEP 507,分别提出了 GitHub [2] 和 GitLab [7]。
2015 年断断续续地致力于这些提案,并试图在核心工作流邮件列表 [8] 上梳理出它们之间的差异。PyCon US 2015 也表明,社区对我们的流程有些不满,原因在于新贡献者的认知负担和核心开发者查看补丁所需的时间过长(例如,参见 Guido van Rossum 在 PyCon US 2015 主题演讲的结尾 [9],作为这种挫败感的例子)。
2016 年 1 月 1 日,Brett Cannon 决定将开发流程迁移到 GitHub。选择 GitHub 的主要原因包括 [10]:
- 维护自定义基础设施对志愿者来说是一个负担(例如,目前正在使用一个未维护的 Rietveld [6] 自定义分支)。
- 自定义工作流对核心开发者来说非常耗时(没有足够的自动化工具来支持它)。
- 自定义工作流对外部贡献者来说是一个障碍(由于需要时间来熟悉 CPython 独有的开发流程,因此成为入门障碍)。
- 除了 GitLab 是开源的之外,GitLab 与 GitHub 之间没有功能上的区别。
- 核心开发者和外部贡献者对 GitHub 的熟悉程度远高于 GitLab。
- 我们的 BDFL 更喜欢 GitHub(他会是第一个告诉你他的意见不重要的人,但做出决定的人认为 BDFL 对他自己的编程语言的工作流程感到满意以鼓励他继续参与很重要)。
甚至已经有一个非官方标志来代表迁移到 GitHub [22]。
此次迁移的首要目标是改进开发流程,使得核心开发者能够通过**某种**开发流程(这不一定意味着 GitHub 的默认工作流),在平板电脑上使用 WiFi 浏览器,从外部贡献提交到所有导致提交该贡献的步骤。最终的解决方案还将允许外部贡献者即使选择不使用 GitHub 也能进行贡献(尽管不能保证功能对等)。
要迁移的仓库
虽然 hg.python.org [1] 托管了许多仓库,但只有五个关键仓库需要迁移:
devinabox 仓库仅包含代码。peps 和 devguide 仓库涉及网页生成。而 cpython 仓库对与 bugs.python.org [5] 的集成有特殊要求。
迁移计划
迁移计划根据迁移 要迁移的仓库 部分列出的仓库所需的内容进行划分。完成每个部分中概述的要求应该会解除相关仓库的迁移障碍。各部分预计按顺序完成,但各部分内的要求不一定。
仅代码仓库的要求
完成本节中的要求将允许 devinabox 仓库迁移到 GitHub。
创建“Python 核心”团队
为了管理权限,将创建一个“Python 核心”团队,作为 python 组织 [16] 的一部分。任何被迁移的仓库都将添加“Python 核心”团队,并赋予写入权限 [17]。以前有权管理 hg.python.org 上的 SSH 密钥的任何人将成为“Python 核心”团队的团队维护者。
定义将 Mercurial 仓库迁移到 Git 的命令
由于迁移到 GitHub 也意味着迁移到 Git [4],我们必须决定运行哪些工具和命令来将 Mercurial 仓库转换为 Git。专门为此次迁移开发的工具托管在 https://github.com/orsenthil/cpython-hg-to-git。
CLA 强制执行
任何开源项目的关键部分是确保其源代码能够获得适当的许可。这需要确保所有贡献者都已签署贡献者许可协议 (CLA) [18]。到目前为止,贡献代码的 CLA 签署由核心开发者通过检查某人用户名旁是否有 * 来强制执行,该星号位于 bugs.python.org [5]。通过此次迁移,计划是首先自动化检查和强制贡献者签署 CLA。
为 bugs.python.org 添加 GitHub 用户名支持
为了将 CLA 签署的跟踪直接控制在 PSF 手中,对已签署 PSF CLA 的人员的跟踪将通过将其事实标记为某人的 bugs.python.org 用户资料的一部分来继续。这意味着需要将一个人的 bugs.python.org [5] 帐户与其 GitHub 帐户关联起来,这将通过用户资料中的一个新字段完成。这隐含地要求贡献者需要同时拥有 GitHub [2] 和 bugs.python.org 帐户才能签署 CLA 并通过 GitHub 进行贡献。
提供了一个 API 来查询 bugs.python.org,以查看 GitHub 用户名是否对应于已签署 CLA 的人。例如,向 http://bugs.python.org/user?@template=clacheck&github_names=brettcannon,notanuser 发送 GET 请求会返回一个 JSON 字典,其键是请求的用户名,如果他们已签署 CLA,则值为 true,如果未签署,则为 false,如果未找到相应的 GitHub 用户名,则为 null。
一个用于强制 CLA 签署的机器人
通过将某人的 GitHub 帐户与他们的 bugs.python.org [5] 帐户关联起来,并且 bugs.python.org 帐户中包含某人是否已签署 CLA 的数据,一个机器人可以监控 GitHub 上的拉取请求,并指示贡献者是否已签署 CLA。
如果用户已签署 CLA,机器人将向问题添加一个正向标签,以表示拉取请求没有 CLA 问题(例如,一个绿色的标签显示“CLA 已签署”)。如果贡献者尚未签署 CLA,将向拉取请求添加一个负向标签,并通过 GitHub 的状态 API 阻止该请求(例如,一个红色的标签显示“CLA 未签署”)。如果贡献者缺少 bugs.python.org 帐户,也将使用负向标签。对正向和负向情况都使用标签可以在机器人发生故障时提供一个备用信号,防止潜在的假阳性或假阴性。它还允许通过简单地移除与 CLA 相关的标签来再次触发机器人(这与使用 GitHub 状态检查 [40] 不同,后者仅在代码更改时触发)。
由于目前没有满足我们需求的现有机器人,它将托管在 Heroku [39] 上,并使用 Python 3.5 编写,作为异步编程的展示。该机器人的代码托管在 Knights Who Say Ni 项目 [41] 中。
将旧仓库设为只读
在现在旧的 Mercurial 仓库的 [hooks] 部分中更新 .hg/hgrc,如下所示:
pretxnchangegroup.reject = echo " * This repo has been migrated to github.com/python/peps and does not accept new commits in Mercurial!" 2>&1; exit 1
将使仓库变为只读。
cpython 仓库的要求
显然,目前托管在 hg.python.org [1] 上最活跃和最重要的仓库是 cpython 仓库 [15]。由于其重要性和高频使用,与本 PEP 中提到的其他仓库相比,它在迁移到 GitHub 之前需要更多的工具支持。
记录提交拉取请求的步骤
在选择新的开发工作流程过程中,决定采用线性历史。人们更喜欢单个提交代表单个更改,而不是一组不相关的提交导致一个代表单个更改的合并提交。这意味着 GitHub 拉取请求中方便的“合并”按钮将设置为只执行_压缩_提交,而不是合并提交。
还将编写第二套推荐命令,用于提交从上传到 bugs.python.org [5] 的补丁文件中的贡献。这显然有助于保持线性历史,但需要确保将贡献归因于补丁作者。
将作为核心开发者指南的确切命令序列是一个悬而未决的问题:Git CLI 命令用于将拉取请求提交到 cpython。
将拉取请求链接到问题
历史上,外部贡献通过文件上传的方式附着到 bugs.python.org [5] 上的问题。对于核心开发者直接提交的更改,在提交消息开头以 Issue # 格式指定问题编号会导致在问题上发布评论,链接到该提交。
将拉取请求链接到问题
需要拉取请求与问题之间的关联来跟踪何时提出了修复。该关联需要是多对一的,因为解决一个问题可能需要多个拉取请求(技术上它应该是一个多对多关联,用于一个修复解决多个问题的情况,但这相当罕见,并且可以使用问题跟踪器上的 Superseder 字段将问题合并为一个)。
拉取请求与问题之间的关联将通过检测问题编号来完成。如果问题在拉取请求的标题或消息正文中指定,则将在 bugs.python.org [5] 上建立连接。将向拉取请求发出一些可见通知——例如标签或消息——以通知关联已成功建立。
如果进行了提交,通知问题
一旦提交完成,相应的issue应更新以反映此事实。无论提交是来自拉取请求还是直接提交,这都应该有效。
更新用于将提交 ID 映射到 URL 的链接服务
目前,您可以使用 https://hg.python.org/lookup/,并提供 cpython 仓库 [15] 的 Subversion 或 Mercurial 副本的修订 ID,以重定向到 Mercurial 仓库中该修订的 URL。URL 重写器需要更新,以重定向到 Git 仓库并支持为 Git 仓库创建的新修订 ID。
最可能的设计是在迁移发生后静态地知道所有的 Mercurial 变更集编号。然后,查找代码将更新为接受 7 到 40 位十六进制数字的哈希。任何长度为 12 或 40 的十六进制数字将与 Mercurial 变更集编号进行比较。如果数字不匹配或长度在 7 到 40 之间,则假定为 Git 哈希。
bugs.python.org 提交编号重写器 也需要更新以接受最短 7 位的哈希,因为 Git 将匹配该长度或更长的哈希。
弃用 sys._mercurial
一旦 Python 不再使用 Mercurial,sys._mercurial 属性将需要更改为返回 ('CPython', '', '')。将添加一个等效的 sys._git 属性,它将满足相同的用例。
更新 devguide
开发指南需要更新以包含新工作流程的详细信息。最有可能的工作将在单独的分支中进行,直到迁移实际发生。
更新 PEP 101
发布流程将需要根据需要进行更新。
可选的计划功能
一旦 cpython 仓库 [15] 迁移完成,所有仓库都将移至 GitHub [2],开发流程的地位应与迁移前持平。但此次迁移的一个关键原因是改进开发流程,使其比以往任何时候都更好。本节概述了一些改进方案。
应该指出,bugs.python.org [5] 的整体功能规划——其中包括独立于本次迁移的计划——在其各自的维基页面 [23] 上进行跟踪。
处理 Misc/NEWS
传统上,Misc/NEWS 文件 [19] 对于跨 Python 版本的更改来说一直是个问题。通常在提交 3.5 和 3.6 之间的更改时,只在 Misc/NEWS 文件中会出现合并冲突。事实上,这种情况非常普遍,以至于开发指南中的示例说明明确提到了如何解决 Misc/NEWS 文件中的冲突 [21]。作为我们工具现代化的一部分,处理 Misc/NEWS 文件将得到简化。
计划的方法是为每个新闻条目使用单独的文件,其中包含条目的文本。在这种情况下,每个功能版本将拥有自己的新闻条目目录,并在该目录中创建一个单独的文件,该文件以其关闭的问题或时间戳值命名(以防止冲突)。跨分支的合并将没有问题,因为新闻条目文件仍将具有唯一的名称,并位于包含修复的最新版本的目录中。一个脚本将收集所有新闻条目文件,无论它们位于哪个目录中,并创建一个适当的新闻文件(发布目录可以忽略,因为文件的存在足以表示该条目属于该版本)。分类可以通过新闻条目文件本身的关键字完成,或者通过在每个发布目录中使用代表每个新闻条目分类的子目录(或者可以放弃新闻条目的分类,因为关键信息由组织化的“What's New”文档捕获)。这种方法的优点是它将更改与实际更改的代码保持一致。它还将消息与引入更改的提交关联起来。对于通过 CLI 进行的提交,可以提供一个脚本来帮助生成文件。在机器人驱动的场景中,合并机器人可以有一种方法来指定特定的新闻条目,并作为其扁平化提交的一部分创建文件(同时最有可能也支持在未指定特定新闻条目时使用提交消息的第一行)。如果使用基于网络的流程,则可以使用状态检查来验证拉取请求中是否存在新的条目文件,以提醒文件缺失。以前已为 Mercurial 工作流编写了此方法的代码,网址为 http://bugs.python.org/issue18967。社区中还有像 https://pypi.python.org/pypi/towncrier、https://github.com/twisted/newsbuilder 和 http://docs.openstack.org/developer/reno/ 这样的工具。
2016 年 9 月 Python 核心开发者冲刺期间的讨论促成了这一决定,与本 PEP 的 Rejected Ideas 部分中概述的被拒绝方法相比。独立文件方法似乎在各种选项中兼顾了灵活性和潜在工具的正确平衡,同时解决了核心问题。
处理 Misc/ACKS
传统上,Misc/ACKS 文件 [20] 是手动管理的。但由于 Git 支持每个提交的 author 值和 committer 值,提交的作者身份可以作为代码历史本身的一部分。
因此,Misc/ACKS 的手动管理将变为可选。将编写一个脚本,收集所有作者和提交者姓名,并将它们与迁移到 Git 之前列出的所有姓名合并到 Misc/ACKS 中。运行此脚本将成为发布过程的一部分。
该脚本还应生成自上次执行以来所有贡献者的列表。这将允许获得对特定版本做出贡献的人员列表,以便可以明确地感谢他们。
创建 https://git.python.org
正如 hg.python.org [1] 目前指向 Python 的 Mercurial 仓库一样,git.python.org 也应该为 Git 仓库做同样的事情。
拉取请求数据备份
由于 GitHub [2] 将用于代码托管和代码审查,因此需要对这两项进行备份。在代码托管的情况下,备份是隐式的,因为所有非浅层 Git [4] 克隆都包含仓库的完整历史记录,因此将有许多仓库备份。
代码审查历史记录没有与仓库本身相同的隐式备份机制。这意味着应该每天进行代码审查历史记录的备份,以防 GitHub 出现任何问题导致数据丢失。它还有助于确保在 GitHub 突然消失的情况下,从 GitHub 迁移到其他代码审查系统是可行的。
生成 cherry-pick 拉取请求的机器人
由于已决定使用 cherry-pick 而不是向前合并分支,因此有一个机器人来根据 cherry-pick 为影响多个分支的任何拉取请求生成拉取请求将非常方便。最可能的设计是一个机器人,它监控已合并的拉取请求,并应用关键标签来区分拉取请求应 cherry-pick 到哪些分支。然后,机器人将为每个标签生成 cherry-pick 拉取请求,并在创建拉取请求时移除标签(这使得在自动 cherry-pick 失败时易于检测)。
拉取请求提交队列
这将线性地应用已接受的拉取请求,并通过运行测试套件来验证提交是否相互干扰,如果测试运行失败则撤销提交。为了帮助加快测试速度,可以在一次测试运行中同时应用自上次测试运行以来提交的所有补丁,因为乐观的假设是这些补丁将协同工作。如果测试不稳定,将需要某种机制来重新运行测试,无论是通过移除“测试失败”标签、为核心开发者提供触发另一个测试事件的网页界面等。
机器人的灵感或基础可以借鉴现有的机器人,如 Homu [31] 或 Zuul [32]。
给这个机器人命名以发出命令是一个悬而未决的问题:机器人的命名。
CI 服务
有各种 CI 服务为托管在 GitHub [2] 上的开源项目提供免费支持。在尝试了几种 CI 服务后,决定选择 Travis [33]。
Python 目前的 CI 服务是 Pypatcher [38]。可以在 IRC 中提出请求,尝试 bugs.python.org [5] 中的补丁。结果可以在 https://ci.centos.org/job/cPython-build-patch/ 查看。
测试覆盖率报告
获取 Python 标准库的最新测试覆盖率报告将非常有益,因为生成此类报告可能需要相当长的时间。
有几个现有的服务为开源项目提供免费的测试覆盖率。最终,Codecov [37] 被选为最佳选择。
通知问题拉取请求评论
目前的开发流程不包括在 Rietveld [6] 上留下审查评论时通知 bugs.python.org [5] 上的问题。最好能解决这个问题,以便人们可以只订阅 bugs.python.org 上的评论,而不是 GitHub [2],但仍然知道 GitHub 上关于相关拉取请求的审查评论何时发生。目前的想法是在一定时间内(例如,15 或 30 分钟,尽管现在 GitHub 支持 审查,时间方面可能不必要)至少有一条审查评论时,向 bugs.python.org 上的相关问题发布一条评论。这可以减少同时接收 GitHub 和 bugs.python.org 电子邮件通知的人的电子邮件量,同时仍然确保只关注 bugs.python.org 的人知道何时可能有审查评论需要处理。
允许 bugs.python.org 使用 GitHub 作为登录提供商
目前,bugs.python.org [5] 允许人们使用 Google、Launchpad 或 OpenID 凭据登录。最好能将其扩展到 GitHub 凭据。
用于重新生成 Web 内容的 Web 钩子
https://docs.pythonlang.cn/、https://docs.pythonlang.cn/devguide 和 https://pythonlang.cn/dev/peps/ 上的内容都源自本次迁移中要移动的仓库中的文件。因此,最好设置适当的 webhook,以便在它们所基于的文件更改时触发重新构建相应的网页内容,而不是不得不等待(例如)cronjob 触发。
如果文档是一个 Sphinx 项目,那么站点可以在 Read the Docs 上有一个非官方镜像,例如 http://cpython-devguide.readthedocs.io/,这可以部分解决这个问题。
将 Web 内容链接回其生成的源文件
对于发现从文件生成的任何文档存在问题的人来说,如果每个页面上都有一个链接指向 GitHub [2] 上存储页面内容的文件,那将非常有帮助。这将允许快速拉取请求来修复简单的错误,例如拼写错误。
这项工作正在 http://bugs.python.org/issue28929 追踪。
将部分文档拆分为独立的仓库
虽然 https://docs.pythonlang.cn 上的部分文档会随代码更改而变化,但其他部分则相当静态,并且与 CPython 代码本身没有紧密绑定。以下文档部分属于这种变化缓慢、松散耦合的类别:
文档的这些部分可以拆分到各自的仓库中,以简化其维护并扩大对它们的提交权限,从而简化其维护。
也有人建议拆分 “新特性” 文档。这需要决定是否可以开发一种工作流程,使得很难忘记更新“新特性”(可能通过添加到 PR 的标签,例如“需要新特性”)。
Git 仓库备份
虽然不是必需的,但最好对各种 Git 仓库进行官方备份,以防灾难。这将由 PSF 基础设施委员会决定这是否值得或不必要。
识别潜在的新核心开发者
Python 开发团队长期以来都有选择新核心开发者的指导方针。指导方针的关键部分是,一个人需要贡献多个被接受的、质量和规模都足够高的补丁,以证明其对 Python 开发流程的理解。可以编写一个机器人来跟踪补丁接受率,并生成一份报告,以帮助识别那些值得考虑成为核心开发者的贡献者。这项工作甚至不一定需要 GitHub 集成,只要所有 git 提交中的 committer 字段都填写正确。
状态
迁移 devinabox [12] 仓库的要求
- 已完成
- 为 bugs.python.org 添加 GitHub 用户名支持 (Maciej Szulik 和 Ezio Melotti)
- 一个用于强制 CLA 签署的机器人: https://github.com/python/the-knights-who-say-ni (Brett Cannon)
- 创建“Python 核心”团队
- 定义将 Mercurial 仓库迁移到 Git 的命令: https://github.com/orsenthil/cpython-hg-to-git (Senthil Kumaran)
需要更新构建步骤的仓库
cpython 仓库 [15]
必需
- 未开始
- 更新 PEP 101 (Ned Deily 承诺执行此操作;非阻塞)
- 进行中
- 弃用 sys._mercurial (http://bugs.python.org/issue27593; Ned Deily 承诺审查;非阻塞)
- 更新用于将提交 ID 映射到 URL 的链接服务 (代码已就绪,一旦 hg 仓库变为只读,需要部署;https://gist.github.com/brettcannon/f8d97c92b0df264cd4db008ffd32daf9;迁移后)
- 已完成
- 如果进行了提交,通知问题 (http://psf.upfronthosting.co.za/roundup/meta/issue611)
- 在适当的问题中跟踪 PR 状态 (http://psf.upfronthosting.co.za/roundup/meta/issue590)
- 更新开发指南,包括记录提交拉取请求的步骤 (https://github.com/python/devguide/milestone/1)
- 更新 b.p.o 上的提交哈希检测以支持 10 和 11 个字符的哈希 (http://psf.upfronthosting.co.za/roundup/meta/issue610)
- 将拉取请求链接到问题 (http://psf.upfronthosting.co.za/roundup/meta/issue589)
- 对每个提交(PR 或直接提交)发送电子邮件至 python-checkins (https://help.github.com/articles/managing-notifications-for-pushes-to-a-repository/)
- 对每个提交(PR 或直接提交)发送消息至 #python-dev (https://github.com/python/cpython/settings/hooks/new?service=irc)
- 从 git 构建文档 (https://github.com/python/docsbuild-scripts/blob/main/build_docs.py 已更新;https://github.com/python/psf-salt/pull/91 用于切换)
- 迁移构建机器人以从 GitHub 触发和拉取
可选功能
- 未开始
- 进行中
- 通知拉取请求评论的问题 (http://psf.upfronthosting.co.za/roundup/meta/issue592)
- 将 b.p.o 补丁转换为 GitHub PRs (http://psf.upfronthosting.co.za/roundup/meta/issue600)
- 已完成
- CI 服务
- 测试覆盖率报告
- 将 Web 内容链接回其生成的源文件
- 处理 Misc/NEWS
- 生成 cherry-pick 拉取请求的机器人
- 编写
.github/CONTRIBUTING.md(以防止不合适的 PR 出现并指向开发指南)
未解决的问题
对于本 PEP,开放问题是指需要就如何处理或解决问题做出决定的问题。开放问题不涉及诸如谁将编写特定代码之类的协调问题。
hg.python.org 的命运
随着代码仓库迁移到 Git [4],技术上不再需要保持 hg.python.org [1] 运行。话虽如此,社区中有些人希望它能继续作为 Git 仓库的 Mercurial [3] 镜像运行。其他人则表示他们仍然需要一个镜像,但希望是使用 Git 的镜像。
由于维护 hg.python.org 不是必需的,将由 PSF 基础设施委员会决定是否值得投入时间和资源来使其保持运行。他们还可以选择是否要在 PSF 基础设施上托管 Git 镜像。
根据达成的决定,其他辅助仓库将被强制迁移,或者它们可以选择继续留在 hg.python.org 上。
用于将拉取请求提交到 cpython 的 Git CLI 命令
由于 Git [4] 对于核心开发者来说可能是一个新的版本控制系统,因此需要将人们预期运行的命令记录下来。这些命令还需要保持线性历史,同时正确归因于拉取请求作者。
当处理上传到 bugs.python.org [5] 的补丁文件时,还需要另一组命令。在这里,线性历史将隐式保留,但需要确保保留/添加归属。
机器人命名
由于命名事物可能导致大规模的无休止争论,Brett Cannon 将选择各种机器人的最终名称(机器人项目本身的名称可以是任何东西,这纯粹是为了在向机器人发出命令或帐户名称时使用的名称)。这些名称必须来自 Monty Python,这很合适,因为 Python 就是以这个喜剧团命名的。
被拒绝的想法
分离 Python 2 和 Python 3 仓库
讨论了是否需要为 Python 2 和 Python 3 分别设置仓库。其想法是,这将缩小整体仓库大小,从而使互联网连接速度慢或带宽有限的用户受益。
最终决定,从物流角度来看,将 CPython 的所有历史保存在一个仓库中更为简单。
首先在 bugfix 分支中提交多版本更改
由于当前开发流程是将更改首先提交到最旧的分支,然后合并到默认分支,因此提出了是否应该沿用此工作流的问题。最终决定,首先在最新分支中提交,然后将更改 cherry-pick 到旧分支将是最佳选择,因为大多数人会本能地从最新分支开始工作,并且在使用 Git [4] 时这是一种更常见的工作流。
对于浏览器内的工作流程,cherry-picking 也更适合机器人。在合并向上的场景中,如果你请求机器人进行合并并且它失败了,那么如果你仍然允许主提交,你就必须立即解决合并冲突,否则你需要推迟整个提交,直到所有合并都能处理。通过 cherry-picking 工作流程,主提交可以继续,同时推迟合并失败的 cherry-picks。这使得管理冲突合并的工作可以分发。
最后,cherry-picking 应该有助于避免合并竞争。目前,当进行跨分支工作时,需要时间在旧分支中提交,可能推送到代表 default 分支的另一个克隆,合并更改,然后向上游推送。Cherry-picking 应该解耦这一点,这样你就无需匆忙进行多分支更改,因为 cherry-pick 可以单独完成。
从提交日志中推导 Misc/NEWS
作为围绕 处理 Misc/NEWS 的讨论的一部分,有人建议从提交日志本身派生文件。在这种情况下,提交消息的第一行将被视为表示更改的新闻条目。将使用一些启发式方法来判断更改是否值得作为新闻条目,例如,是否列出了问题编号。
这个想法已被拒绝,因为一些核心开发者更喜欢单独撰写新闻条目,而不是将其包含在提交消息中。他们的论点是,提交消息的第一行与新闻条目在简洁性、内容等方面有不同的要求。
从 bugs.python.org 中推导 Misc/NEWS
解决 NEWS 文件问题的被拒绝方案是在 bugs.python.org [5] 上指定条目。这意味着一个被标记为“已解决”的问题,在问题跟踪器中添加新闻条目到“news”字段之前无法关闭。将新闻条目与问题关联起来的好处是,它确保所有值得作为新闻条目的更改都附带一个问题。它还使得新闻条目的分类自动化,这要归功于问题的组件字段。问题的版本字段还将新闻条目与受影响的 Python 版本关联起来。将编写一个脚本,查询 bugs.python.org 以获取某个版本的相关新条目,并生成需要检查到代码仓库中的输出。这种方法与提交是通过 CLI 还是机器人完成无关。一个缺点是,更改的实际提交与新闻条目之间存在脱节,因为它们存在于不同的位置(在本例中是 GitHub 和 bugs.python.org)。这意味着进行提交后需要记住返回 bugs.python.org 添加新闻条目。
参考资料
版权
本文档已置于公共领域。
来源: https://github.com/python/peps/blob/main/peps/pep-0512.rst
最后修改: 2025-02-01 08:59:27 GMT