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

Python 增强提案

PEP 347 – 将 Python CVS 迁移到 Subversion

作者:
Martin von Löwis <martin at v.loewis.de>
讨论至:
Python-Dev 列表
状态:
最终版
类型:
流程
创建日期:
2004年7月14日
发布历史:
2004年7月14日

目录

摘要

Python 源代码目前在 sourceforge.net 上的一个 CVS 仓库中进行管理。本 PEP 提议将其迁移到 svn.python.org 上的 Subversion 仓库。

基本原理

这一变更涉及两个方面:从 CVS 迁移到 Subversion,以及从 SourceForge 迁移到 python.org。对于每个方面,都将给出理由。

迁移到 Subversion

CVS 存在许多限制,这些限制已被 Subversion 消除。对于 Python 的开发而言,最显著的改进是

  • 能够重命名文件和目录,并删除目录,同时保留这些文件的历史记录。
  • 通过全局版本号支持变更集(对多个文件进行关联更改的集合)。变更集是事务性的。
  • 原子化、快速的标记:CVS 标记可能需要很多分钟;Subversion 标记(svn cp)将快速且原子化地完成。同样,分支也非常高效。
  • 支持离线 diff,这在创建补丁时非常有用。

迁移到 python.org

过去几年,SourceForge 提供了重要的基础设施。不幸的是,SF 受到的关注也导致过去多次出现过载情况,SF 运营商无法总是及时响应。特别是对于 CVS,他们不得不通过引入第二个只读 CVS 服务器用于匿名访问来减轻主 CVS 服务器的负载。该服务器定期同步,但在同步之间滞后于读写 CVS 仓库。因此,没有提交访问权限的用户只能在延迟后才能看到仓库的最新更改。

在 python.org 上,可以使仓库可供匿名访问。

迁移过程

要迁移 Python CVS 仓库,需要执行以下步骤。这些步骤将在以下章节中详细阐述。

  1. 收集所有当前提交者的 SSH 密钥,以及将显示在提交消息中的用户名。
  2. 在迁移开始时,宣布 SourceForge 上的仓库已关闭。
  3. 在最后一次提交后 24 小时,下载 CVS 仓库。
  4. 将 CVS 仓库转换为 Subversion 仓库。
  5. 发布仓库,为提交者提供写入权限,并提供只读匿名访问。
  6. 禁用 SF 上的 CVS 访问。

收集 SSH 密钥

经过一番讨论,svn+ssh 被选为仓库写入访问的最佳方法。开发人员可以继续使用他们的 SSH 密钥,但它们必须安装在 python.org 上。

为了避免为每个开发人员创建新的 Unix 用户,应使用单个帐户,并在 authorized_keys 文件中使用 command= 属性。

authorized_keys 文件中的行应如下所示(为便于阅读而换行)

command="/usr/bin/svnserve --root=/svnroot -t
--tunnel-user='<username>'",no-port-forwarding,
no-X11-forwarding,no-agent-forwarding,no-pty
ssh-dss <key> <comment>

作为用户名,应使用真实姓名而不是 SF 帐户名,以便在日志消息中更好地识别人员。

管理员访问

应授予 Python SF 项目所有当前管理员对 pythondev 帐户的管理员访问权限。为了区分 shell 登录和 svnserve 登录,管理员需要维护两个密钥。使用 OpenSSH,可以使用以下过程创建第二个密钥

cd .ssh
ssh-keygen -t DSA -f pythondev -C <user>@pythondev
vi config

在配置文件中,需要添加以下行

Host pythondev
  Hostname dinsdale.python.org
  User pythondev
  IdentityFile ~/.ssh/pythondev

然后,可以通过“ssh pythondev”进行 shell 登录。

下载 CVS 仓库

CVS 仓库可以从以下地址下载:

由于此 tarball 每天只生成一次,因此在仓库冻结后需要经过一段时间才能获取 tarball。应验证 python-commits 邮件列表中记录的最后一次提交确实包含在 tarball 中。

转换后,转换后的 CVS tarball 应永久保存在 www.python.org/archive/python-cvsroot-.tar.bz2

转换 CVS 仓库

Python CVS 仓库包含两个模块:distutils 和 python。python 模块进一步分为 dist 和 nondist,其中 dist 只包含 src(Python 代码本身)。nondist 包含各种子目录。

这些应在 Subversion 仓库中重新组织,以获得更短的 URL,遵循 <项目>/{trunk,tags,branches} 结构。将为每个 nondist 目录创建一个项目,以及用于 src(称为 python)和 distutils。重新组织仓库最好在 CVS 树中完成,如下所示。

应使用 fsfs 后端作为仓库格式(这需要 Subversion 1.1)。fsfs 后端具有更利于备份的优点,因为它允许增量仓库备份,而无需运行任何 dump 命令。

转换应使用 cvs2svn 实用程序完成,例如在 cvs2svn Debian 包中可用。由于 cvs2svn 目前不支持 project/trunk 结构,因此每个项目都需要单独转换。为了将每个转换结果放入目标仓库中的单独目录,必须使用 svnadmin load。

Subversion 对二进制文件与文本文件的看法与 CVS 不同。为了正确地传递 CVS 语义,应将所有在 CVS 中未标记为二进制的文件上的 svn:eol-style 设置为 native。

总之,转换脚本是

#!/bin/sh
rm cvs2svn-*
rm -rf python py.new
tar xjf python-cvsroot.tar.bz2
rm -rf python/CVSROOT
svnadmin create --fs-type fsfs py.new
mv python/python python/orig
mv python/orig/dist/src python/python
mv python/orig/nondist/* python
# nondist/nondist is empty
rmdir python/nondist
rm -rf python/orig
for a in python/*
do
  b=`basename $a`
  cvs2svn -q --dump-only --encoding=latin1 --force-branch=cnri-16-start \
  --force-branch=descr-branch --force-branch=release152p1-patches \
  --force-tag=r16b1 $a
  svn mkdir -m"Conversion to SVN" file:///`pwd`/py.new/$b
  svnadmin load -q --parent-dir $b py.new < cvs2svn-dump
  rm cvs2svn-dump
done

此转换的示例结果可在以下地址获得:

发布仓库

仓库应发布在 http://svn.python.org/projects。应通过 svn+ssh://pythondev@svn.python.org/ 授予所有当前 SF 提交者读写访问权限;还应通过 WebDAV 授予只读匿名访问权限。

作为选项,可以提供 websvn(例如来自 Debian websvn 包)。不幸的是,在测试安装中,websvn 因为内存不足而崩溃。

当前的 SF 项目管理员应获得 pythondev 帐户的 authorized_keys2 文件的写入权限。

禁用 CVS

CVS 似乎无法完全禁用。只能从项目页面中删除用户界面;仓库本身仍然可用。如果需要,可以通过 CVS commitinfo 条目禁用对 python 和 distutils 模块的写入访问权限。

讨论

针对上述程序提出了几种替代方案。此处简要讨论了被拒绝的替代方案

  • 创建多个仓库,一个用于 python,一个用于 distutils。这将允许更短的 URL,但被拒绝,因为单个仓库支持跨项目移动代码。
  • 几个人建议通过标准 cvs2svn 创建 project/trunk 结构,然后进行重命名。这将带来旧版本使用与最近版本不同的路径名称的缺点;通过 dump 文件进行的建议方法无需重命名即可工作。
  • 几个人还表达了对在 python.org 上托管仓库会给 pydotorg 管理员带来管理开销的担忧。作为一项具体替代方案,建议使用 BerliOS。pydotorg 管理员自己并未反对额外的工作量;如果他们工作量过大,再次迁移仓库是一个选择。
  • 讨论了不同的身份验证策略。作为 svn+ssh 的替代方案,建议使用
    • 通过 WebDAV 使用 Subversion,使用 SSL 和基本身份验证,并向用户发送 pydotorg 生成的密码。人们不喜欢这种方法,因为他们需要将密码存储在磁盘上(因为他们记不住);这存在安全风险。
    • 通过 WebDAV 使用 Subversion,使用 SSL 客户端证书。这可行,但需要我们管理证书颁发机构。
  • 人们建议将其托管在其他地方,而不是托管在 python.org 上。一个问题是此替代方案应该是免费的还是商业的;几个人建议最好是商业的,以减轻志愿者的负担。特别是
    • Greg Stein 建议 http://www.wush.net/subversion.php。他们提供 5 GB 存储空间,每月 90 美元,每月 200 GB 下载量。数据存储在 RAID 驱动器上并完全备份。支持匿名访问和电子邮件提交通知。wush.net 阐述了以下细节
      • 该机器将是一个 Virtuozzo 虚拟专用服务器 (VPS),托管在 PowerVPS。
      • 默认仓库 URL 将是 http://python.wush.net/svn/projectname/,但可以安排其他任何内容
      • 我们将获得对机器的 SSH 登录权限,并具有 sudo 功能。
      • 他们有一个用于管理我们要托管的各种 SVN 仓库和管理用户帐户的 Web 界面。虽然将支持 svn+ssh,但用户界面尚不支持。
      • 对于异地镜像/备份,他们建议使用 rsync 而不是下载仓库 tarball。

      Bob Ippolito 报告说,他们曾使用 wush.net 进行商业项目约 6 个月,之后他们离开了 wush.net,因为服务中断了三天,无人可联系,并且恢复时也没有任何解释。


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

最后修改:2025-02-01 08:59:27 GMT