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) 将快速且原子地完成。同样,分支也非常高效。
- 支持离线差异,这在创建补丁时很有用。
迁移到 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-<date>.tar.bz2 上。
转换 CVS 仓库
Python CVS 仓库包含两个模块:distutils 和 python。python 模块进一步划分为 dist 和 nondist,其中 dist 仅包含 src(Python 代码本身)。nondist 包含各种子目录。
这些应在 Subversion 仓库中重新组织,以获得更短的 URL,遵循 <project>/{trunk,tags,branches} 结构。将为每个 nondist 目录创建一个项目,以及为 src(称为 python)和 distutils 创建一个项目。最好在 CVS 树中重新组织仓库,如下所示。
应使用 fsfs 后端作为仓库格式(这需要 Subversion 1.1)。fsfs 后端具有更易于备份的优点,因为它允许增量仓库备份,而无需运行任何转储命令。
应使用 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 结构,然后进行重命名。这将导致旧版本使用与新版本不同的路径名;建议的通过转储文件的方法无需重命名即可工作。
- 一些人还对在 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 详细说明了以下内容:
- 机器将是托管在 PowerVPS 上的 Virtuozzo 虚拟专用服务器 (VPS)。
- 默认仓库 URL 将为 http://python.wush.net/svn/projectname/,但也可以安排其他 URL。
- 我们将获得具有 sudo 权限的 SSH 登录权限。
- 他们有一个 Web 界面,用于管理我们要托管的各种 SVN 仓库以及管理用户帐户。虽然支持 svn+ssh,但用户界面尚不支持它。
- 对于异地镜像/备份,他们建议使用 rsync 而不是下载仓库 tarball。
Bob Ippolito 报告说,他们在大约 6 个月前的一个商业项目中使用了 wush.net,之后他们离开了 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
上次修改时间:2023年9月9日 17:39:29 GMT