Yang Yubo's Life @ Refactoring

Subversion 1.7 - CVCS 和 DVCS 开始走向融合

written on Friday, March 12, 2010

根据 Subversion 团队的乐观估计, 跳票了大半年的 1.7 版本很有可能在 2010 年上半年发布. 自从 SVN 被 Apache 招到麾下, 代码更新速度明显呈加速趋势.

1.7 相对 1.6 的变化相当大, 我比较关注的新特性包括: 新的 HTTPv2 协议, 期待已久的永久删除, 下一代工作副本 (WC-NG)

新的 HTTPv2 协议

如果你曾经对比过 svnservemod_svn 不同部署方式下的访问速度, 会明显感觉到基于 HTTP WebDAV 协议效率不佳 (比 svn:// 协议至少慢上 4 倍).

效率低下最主要的因素:

  • HTTP 是无状态协议, 一次完整 Subversion 请求会被 mod_svn 拆分成几十甚至上百次独立 HTTP 请求.
  • mod_svn 严格遵循 HTTP WebDAV 协议规范, 包括一些导致效率低下, 而很少能用上的功能. Subversion 为了支持所有 WebDAV 客户端能对 SVN 库进行操作而导致性能降低, 实在是得不偿失 (很少有人放着 SVN 客户端不用, 却用 Windows Xp 的 "Web 文件夹" 来操作 Subversion 库).

Subversion 分别提出了相应的解决方案:

  • 异步多路复用的客户端 HTTP 库 serf 将取代 neon 库成为默认选项, 某些情况下, 提速能达到 4 倍.
  • 新的 HTTPv2 协议, 专为性能和可读性打造, 放弃 "古老" / 复杂 / 低效的 DeltaV 标准.

期待已久的永久删除

1.7 之前的 Subversion 没有后悔药可以吃 -- 一旦有成员上传了编译过程临时文件, 这些呆废料将伴随整个库的生存周期.

svn dump 过滤命令看似可以解决这个问题, 但实际上可操作性极差. 随着库的总大小增长, 永久删除文件的成本加速上升.

1.7 的 "Obliterate" 特性非常值得期待, 让某些误操作不再是整个团队的负担:

  • 支持 永久删除 特定文件的指定修订版本
  • 支持 永久删除 特定目录的指定修订版本
  • 支持 永久删除 特定文件的所有修订版本 (即让这个文件彻底消失)
  • 但是不支持永久删除 文件中的指定内容

下一代工作副本 (WC-NG)

这是 1.7 的重头戏, 这项特性意味着 SVN 在慢慢向 Git / Mercurial / Bazaar 等 DVCS 靠拢. WC-NG离线提交 和其它 DVCS 特性的基础工作, 我们会在未来的 2.0 版本中, 看到这一功能的优势被放大.

用户可见的主要影响包括:

  • 集中式的工作副本元数据 (1.6 及其以前版本, SVN 会在工作副本的每个目录下放置一个 .svn 文件夹存放元数据信息, 相当恶心)
  • 使用 SQLite 存储元数据
  • 解决文件名大小写的问题

就 1.7 版本而言, 还没有提供 离线提交 的功能. 离线提交 对开发人员的体验改善应该会相当明显, 期待 2.0 版本的到来.

正在考虑迁移到 DVCS?

我之前 翻译过的一篇论文, 主题是调查现在开源项目向 DVCS 迁移的趋势, 但截止到今天 (2010-03-12) 论文作者尚未发表对于企业应用中 DVCS 迁移成本和潜在风险的相关文章.

对于内部企业开发, 如果网络带宽 (内部或外部) 和磁盘响应速度不是瓶颈, 坚持 SVN 阵营是个不错的选择. 2.0 版本会更多的融入 DVCS 元素, 相信开发体验也将更友好.

This entry was tagged CVCS, DVCS and SVN

blog comments powered by Disqus