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 仓库,需要执行以下步骤。这些步骤将在以下章节中详细阐述。
- 收集所有当前提交者的 SSH 密钥,以及将显示在提交消息中的用户名。
- 在迁移开始时,宣布 SourceForge 上的仓库已关闭。
- 在最后一次提交后 24 小时,下载 CVS 仓库。
- 将 CVS 仓库转换为 Subversion 仓库。
- 发布仓库,为提交者提供写入权限,并提供只读匿名访问。
- 禁用 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-
转换 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,因为服务中断了三天,无人可联系,并且恢复时也没有任何解释。
- Greg Stein 建议 http://www.wush.net/subversion.php。他们提供 5 GB 存储空间,每月 90 美元,每月 200 GB 下载量。数据存储在 RAID 驱动器上并完全备份。支持匿名访问和电子邮件提交通知。wush.net 阐述了以下细节
版权
本文档已置于公共领域。
来源:https://github.com/python/peps/blob/main/peps/pep-0347.rst