Following system colour scheme - Python 增强提案 Selected dark colour scheme - Python 增强提案 Selected light colour scheme - Python 增强提案

Python 增强提案

PEP 481 – 将 CPython 迁移到 Git、Github 和 Phabricator

作者:
Donald Stufft <donald at stufft.io>
状态:
已撤回
类型:
流程
创建日期:
2014 年 11 月 29 日
发布历史:
2014 年 11 月 29 日

目录

摘要

注意

此 PEP 已撤回。如果您正在寻找记录迁移到 Github 的 PEP,请参阅 PEP 512

此 PEP 提议将 CPython 及其支持存储库的存储库托管迁移到 Git 和 Github。它还提议将 Phabricator 添加为 Github Pull Requests 的替代方案,以处理更改的审查。本 PEP 是对 PEP 474PEP 462 的替代方案,后者旨在实现相同的整体效益,但仅限于支持 Mercurial 且完全开源的工具。

基本原理

CPython 是一个开源项目,依赖于许多志愿者贡献自己的时间。作为一个开源项目,它依赖于吸引新志愿者和留住现有志愿者,以便继续拥有健康的可用人力。除了增加项目的可用人力外,它还需要有效地利用已有的人力。

CPython 项目当前的工具链是自定义且独特的工具组合,它强制执行一种与许多旧项目类似但随着时间推移越来越不受欢迎的工作流程。

CPython 工具链和工作流程的一次性性质意味着任何新贡献者都需要花时间学习工具和工作流程,然后才能开始为 CPython 做贡献。一旦新贡献者完成了学习 CPython 工作流程的过程,他们也不太可能将这些知识应用到他们未来想要贡献的其他项目中。这会成为贡献的障碍,吓跑潜在的新贡献者。

此外,CPython 使用的工具维护不善、过时,并且缺少重要功能,这些功能可以帮助提交者更有效地利用时间审查和批准更改。由于维护不善,错误可能会持续更长时间(如果它们得到修复的话),并且它更有可能长时间宕机。过时的原因是它无法有效利用现代 Web 平台的强大功能。最后,由于它缺少一些重要功能,例如缺乏预先测试提交和缺乏自动合并工具,提交者在提交最简单的更改时也必须做不必要的忙碌工作。

版本控制系统

需要做出的第一个决定是主要服务器端存储库的版本控制系统(VCS)。目前,CPython 存储库以及许多支持存储库都使用 Mercurial。在评估 VCS 时,我们必须考虑 VCS 本身的功能以及围绕该 VCS 的社区的网络效应和思想份额。

实际上只有两个真正的选择:Mercurial 和 Git。在这两者之间,技术能力在很大程度上是相当的。因此,本 PEP 将在很大程度上忽略有关 VCS 系统的技术论证,而将重点放在社会方面。

无法获得使用特定 VCS 的项目或人员的确切数字,但我们可以通过查看多个信息来源来推断项目正在使用哪个 VCS。

The Open Hub(以前的 Ohloh)的统计数据显示 [1],The Open Hub 索引的存储库中有 37% 使用 Git(仅次于 SVN 的 48%),而 Mercurial 仅占 2%(仅高于 Bazaar 的 1%)。这意味着 Git 在 The Open Hub 上的受欢迎程度是 Mercurial 的 18 倍多。

关于不同 VCS 流行度的另一个信息来源是 PyPI 本身。此来源更针对 Python 社区本身,因为它代表了为 Python 开发的项目。不幸的是,PyPI 没有一个标准位置来表示此信息,因此需要手动处理。如果我们将搜索范围限制在 PyPI 上的前 100 个项目(按下载量排序),我们可以看到其中 62% 使用 Git,22% 使用 Mercurial,13% 使用其他。这意味着 Git 在 PyPI 前 100 个项目中的受欢迎程度是 Mercurial 的近 3 倍。

显然,从这些数字来看,Git 是迄今为止最流行的开源项目分布式版本控制系统(DVCS),选择更流行的 VCS 会带来许多积极的好处。

对于新贡献者来说,这增加了他们作为参与其他项目的一部分而已经学会 Git 基本知识的可能性,或者如果他们现在才开始学习 Git,那么他们能够将这些知识应用到其他项目中。此外,更大的社区意味着更多的人编写如何操作的指南、回答问题以及撰写有关 Git 的文章,这使得新用户更容易找到他们试图学习的工具的答案和信息。

另一个好处是,由于社区规模更大,将会有更多围绕它编写的工具。这增加了从 GUI 客户端、辅助脚本、存储库托管等各种选择。

存储库托管

此 PEP 提议允许提交 GitHub Pull Requests,但 GitHub 没有办法提交针对非托管在 GitHub 上的存储库的 Pull Requests。此 PEP 还提议,除了 GitHub Pull Requests 之外,还可以使用 Phabricator 的 Differential 应用程序来提交拟议的更改,并且 Phabricator *确实* 允许提交针对非托管在 Phabricator 上的存储库的更改。

因此,此 PEP 提议将 GitHub 作为存储库的规范位置,并在 Phabricator 中设置一个只读镜像。如果将来不再需要 GitHub,那么存储库托管可以轻松地完全迁移到 Phabricator,并且可以放弃接受 GitHub Pull Requests 的能力。

除了在 Github 上托管存储库之外,还将所有存储库的只读副本镜像到 PSF 基础设施。

代码审查

目前 CPython 使用一个自定义的 Rietveld 分支,该分支已被修改为不运行在 Google App Engine 上,目前只能由一个人维护。此外,它还缺少许多现代代码审查工具中存在的功能。

此 PEP 提议允许使用 Github Pull Requests 和 Phabricator 更改来提交更改和审查代码。它同时建议这两种方式,以便贡献者可以选择最适合他们提交更改的工具,并且审查者可以专注于审查他们最喜欢的工具中的更改。

GitHub Pull Requests

GitHub 是一个非常受欢迎的代码托管站点,并且日益成为人们寻找参与项目的主要地点。启用用户通过 GitHub 贡献,就是让贡献者使用他们可能已经熟悉的工具进行贡献,如果他们不熟悉,他们很可能能够将其应用到其他项目中。

GitHub Pull Requests 相较于旧的“将补丁提交到错误跟踪器”模型具有相当大的优势。它允许开发人员完全使用其 VCS 和标准的 VCS 工具进行工作,因此不需要创建补丁文件并找出上传到何处的正确位置。这降低了发送更改进行审查的门槛。

在审查方面,GitHub Pull Requests 更容易审查,它们具有漂亮的语法高亮显示 diff,可以以统一或并排视图进行操作。它们允许将 diff 的上下文扩展到包括整个文件。最后,它们允许对 diff 进行内联评论,并对整个 pull request 进行评论,并以一种漂亮的统一方式呈现,同时隐藏不再适用的评论。Github 还提供了一个“渲染的 diff”视图,可以轻松查看渲染标记(如 rst)的 diff,而无需审查原始标记的 diff。

Pull Request 工作流程还使得在实际合并更改之前能够轻松地预先测试更改。任何特定的 pull request 都可以应用任意数量的不同类型的“提交状态”,将提交(以及因此的 pull request)标记为待定、成功、出错或失败状态。这样可以轻松地内联查看 pull request 是否通过了所有测试,贡献者是否签署了 CLA 等。

实际合并一个 Github Pull Request 非常简单,一旦 Pull Request 上所有检查的状态都为绿色成功,核心审查者只需按下“Merge”按钮。

GitHub 还提供了一个完善的工作流程,可以通过其 Web 界面完全提交项目的 pull requests。这将使 Python 文档在每个页面上都有“在 GitHub 上编辑”按钮,而发现拼写错误、不准确之处或只是想改进当前编写的文档的人,可以简单地点击该按钮,即可在浏览器中使用编辑器进行更改并提交 pull request,所有这些都可以在舒适的浏览器环境中完成。

Phabricator

除了 GitHub Pull Requests 之外,此 PEP 还提议设置一个 Phabricator 实例并将其指向 GitHub 托管的存储库。这将允许利用 Phabricator 的审查应用程序 Differential 和 Audit。

Differential 的功能与 GitHub pull requests 类似,但它们需要安装 arc 命令行工具才能将补丁上传到 Phabricator。

是否为任何特定存储库启用 Phabricator 可以逐个存储库决定,本 PEP 仅提议为 CPython 存储库启用它,但对于 PEP 存储库等较小的存储库,可能不值得这样做。

批评

X 不是用 Python 编写的

当前工具(Mercurial、Rietveld)的一个特点是所有组件的主要语言都是 Python。本 PEP 的观点是我们应该专注于工作的*最佳*工具,而不是碰巧用 Python 编写的*最佳*工具。志愿者的时间是任何开源项目的宝贵资源,我们通过关注工具本身的优点和缺点,而不是作者碰巧用什么语言编写它们,来最好地尊重和利用这些时间。

一个担忧是修改工具以适应我们的能力,但这里的目标之一是*不*修改软件来适应我们,而是适应更标准的工作流程。这种标准化带来了无需修改即可重用工具的好处,从而释放了开发人员的时间来实际开发 Python 本身,并促进了项目之间的知识共享。

但是,如果我们需要修改工具,Git 本身主要用 C 编写,与 CPython 本身一样。它也可以用任何语言编写命令,包括 Python。Phabricator 用 PHP 编写,PHP 在 Web 世界中是一种相当普遍的语言,并且相当容易上手。GitHub 本身主要用 Ruby 编写,但鉴于它不是开源的,因此无法修改它,所以它的实现语言完全没有意义。

GitHub 不是自由/开源的

GitHub 是此提案的重要组成部分,而那些更倾向于意识形态而非实用主义的人可能会仅凭这一点就反对此 PEP。本 PEP 的观点是,虽然使用完全自由/开源的软件是一个吸引人的想法和一个崇高的目标,但通过为贡献者提供维护良好且他们已经熟悉或如果他们学会了就可以应用于其他项目的良好工具来重视贡献者的时间,比将某物是否为自由/开源视为硬性要求更重要。

然而,历史表明,有时仁慈的专有公司可能会停止仁慈。这一点通过以下几种方式来规避:

  • 我们不使用 GitHub Issue Tracker,原因不仅是它对 CPython 不够强大,而且还因为对于主要的 CPython 存储库,如果我们将来需要离开 GitHub,将我们的问题迁移到其他地方的能力取决于 GitHub 继续允许 API 访问。
  • 我们正在使用 GitHub Pull Request 工作流程,但所有这些更改都保存在 Git 中。因此,GitHub 存储库的镜像可以轻松地包含所有这些 Pull Requests。如果我们 GitHub 突然变成“邪恶”的,我们可能会丢失任何评论,但更改本身仍然会存在。
  • 我们正在使用 GitHub 存储库托管功能,但由于这只是 Git,因此从 GitHub 迁移就像将存储库推送到另一个位置一样简单。存储库本身的数据可移植性非常高。
  • 我们还利用 Phabricator 为那些不希望使用 GitHub 的人提供替代方案。如果将来我们需要停止使用 GitHub,这也可以作为一个已经就位的备用选项。

依赖 GitHub 除了平台本身的优势之外,还带来了许多额外的好处。由于这是一个商业支持的企业,它有全职员工负责维护其服务。这包括确保它们正常运行、确保它们针对各种安全漏洞进行修补,以及随着时间的推移进一步改进软件和基础设施。

Mercurial 比 Git 好

在技术层面 Mercurial 或 Git 哪个更好是一个高度主观的意见。本 PEP 不说明 Git 或 Mercurial 的机制哪个更好,而是侧重于两种选择可用的网络效应。由于本 PEP 提议切换到 Git,这会排除偏爱 Mercurial 的人,但那些用户可以通过使用 hg-git [2] 扩展程序轻松地继续使用 Mercurial,该扩展程序允许它与服务器端为 Git 的存储库一起工作。

CPython 工作流程太复杂

先前讨论中出现的一种观点是,CPython 的多分支模型对于 Github Pull Requests 来说过于复杂。本 PEP 的观点是,这个说法不准确。

目前,任何特定的更改都需要为 2.7 和 3.x 手动创建一个补丁,这在这方面不会有任何改变。

如果有人为当前稳定分支(目前是 3.4)提交修复,则可以使用 GitHub Pull Request 工作流程在浏览器中创建一个 Pull Request,将当前稳定分支合并到 master 分支(假设没有合并冲突)。如果存在合并冲突,则需要在本地处理。这比当前必须始终在本地进行合并的情况有所改进。

最后,如果有人为当前开发分支提交修复,那么如果也希望将其包含在稳定分支中,则必须手动应用。在新的工作流程中,这也必须在本地进行,但对于小的更改,可以在 GitHub Web 编辑器中轻松完成。

从这个角度来看,我认为*任何*系统都无法隐藏维护多个长期运行分支所涉及的复杂性。工具唯一能做的就是使提交更改尽可能容易。

示例:Scientific Python

迁移到 Git 和 Github 的关键理念之一是,DVCS 的一个特性、存储库托管以及使用的工作流程是使用这些工具的社交网络和社区规模。我们可以通过查看 Python 社区的一个子社区的例子来证明这一点:Scientific Python 社区。他们已经使用基于 Pull Request 的工作流程将 SciPy 堆栈的大部分关键组件迁移到了 Github。这个过程始于 IPython,随着更多项目迁移过来,它成为了新项目在社区中的自然默认选项。

他们声称从这次迁移中看到了巨大的好处,因为它使得普通贡献者可以在他们子社区内的不同项目之间轻松切换,而无需学习每个项目的特殊、定制化工作流程和不同的工具链。他们发现,当人们可以利用有限的时间来实际贡献而不是学习不同的工具和工作流程时,他们不仅对一个项目贡献更多,而且还会扩展到其他项目。这次迁移也被归因于该社区成员将他们的研究和教育材料发布在 Github 上的倾向性增加。

这个例子展示了迁移到高度流行的工具链和工作流的真正力量,因为每种变化都会为新贡献者和普通贡献者增加一个障碍,并且学习该工作流所花费的时间在与其他项目上的可重用性降低。

参考资料


来源:https://github.com/python/peps/blob/main/peps/pep-0481.rst

最后修改:2025-02-01 08:55:40 GMT