Apache Software Foundation
[S] Subversion

Subversion 1.6发布说明

本文根据原文r36726,由Subversion中文站的中文化翻译小组翻译,欢迎各位参与翻译工作,加入地址:http://code.google.com/p/svncndoc/,参与翻译的志愿者包括rocksun

Subversion 1.6的新东西

Subversion 1.6是所有以前Subversion版本的超集,可以认为是当前最好的版本。任何1.0.x到1.5.x的bug修正和特性,都存在于1.6中。新的特性最终会纪录在Subversion图书中(svnbook.red-bean.com)。

本文描述了主要的变更,完整的列表可以看CHANGES的1.6部分。

兼容性情况

以前的客户端和服务器可以直接与1.6的服务器和客户端交互,然而,如果服务器和客户端不全是1.6时,一些新的1.6特性将会不可用。而另外一些特性,在服务器是旧的,客户端是新的时,可以运行但是效率比较低。

没有必要转储并重新加载版本库,subversion 1.6可以读取以前创建的版本,升级只需用最新的库和二进制程序覆盖原来的程序。

Subversion会维护与先前版本API/ABI的兼容,只会增加新的特性,而不会删除旧的特性。根据1.0, 1.1, 1.2, 1.3, 1.4或1.5 的API编写的程序,可以使用1.6的库编译,为1.6编写的程序不一定能为旧库编译或运行。

新特性的兼容性表格

新特性 Minimum Client1 Minimum Server Minimum Repository 说明
FSFS Packing any 1.6 1.6
Tree Conflicts 1.6 1.6 any 可以用1.6以前的服务器,但是某些类的冲突将不能检测到。
1提醒:在使用file://访问方法时,Subversion程序同时是客户端服务器。

工作拷贝和版本库文件系统格式变更

工作拷贝格式已经升级,这意味着1.5和更老的Subversion客户端不能在Subversion 1.6的工作拷贝上工作,工作拷贝是自动升级的

类似的,版本库文件系统格式也已经改变,意味着那些直接访问库的1.5以及旧的版本的工具如svnserve, mod_dav_svn, svnadmin等不能读取Subversion 1.6的版本库,但是版本库不是自动升级的

工作拷贝升级

警告:如果一个Subversion 1.6客户端遇到了一个1.6以前的工作拷贝,它会在接触到工作拷贝时自动升级工作拷贝格式,并使旧的Subversion客户端不能再读这些工作拷贝了。如果你在机器上使用多个版本的Subversion,请确认你对工作拷贝使用的subversion版本,防止意外升级工作拷贝。(但是这种“自动升级”行为不会发生在版本库上,只发生在工作拷贝。)

如果你意外的将工作拷贝从1.5升级到1.6,并希望降级到1.5,可以使用change-svn-wc-format.py,详情看这篇FAQ文章,也可以加--help运行来查看使用指导。

版本库升级

Subversion 1.6服务器可以与1.5和以前的版本库工作,如果不使用svnadmin upgrade命令,版本库不会自动升级到1.6。这意味仅仅升级服务器不能直接得到某些特性,你也需要升级版本库。(我们决定不使用自动升级版本库,因为我们不希望subversion 1.6偷偷的升级成1.5不可用的版本库,这对于版本库管理来说是一件很慎重的事情。)

命令行输出的变更

尽管我们希望尽可能让命令行程序的的输出与以前版本保持兼容,但是还是要添加一些信息,这会破坏一些精确依赖输出的脚本。

改善的svn proplist --verbose输出

XXX(r32484): svn proplist --verbose的输出已经改善。

   $ svn proplist --verbose build.conf
   Properties on 'build.conf':
     svn:eol-style
       native
     svn:mergeinfo
       /trunk/build.conf:1-4800
       /branches/a/build.conf:3000-3400
       /branches/b/build.conf:3200-3600
   $ 

svn status的输出发生变化

svn status增加了第7列输出,用来显示项目是否为目录树冲突的牺牲品,另外还增加了一行,显示目录树中冲突的详细描述。

   $ svn status
   M       Makefile.in
   A     C src/error.c
         >   local add, incoming add upon update
   M       src/log.c
   M     C src/path.c
         >   local edit, incoming delete upon update
   D     C src/properties.c
         >   local delete, incoming edit upon merge
   M     C src/time.c
   $ 

钩子变更

pre-lock中对于输出数据处理的变化

XXX(r32778)

新特性

版本库根的相对URL (客户端)

XXX (描述)

   $ svn SUBCOMMAND ^/
   $ svn SUBCOMMAND ^/PATH

svn:externals的改进

Subversion 1.6对于svn:externals的使用增加了许多新的特性。包括:

支持文件的svn:externals (客户端)

如果svn:externals的描述指向了一个文件,这个文件会作为版本化条目加入到工作拷贝。

目录和文件外部定义有一些区别。

  • 文件外部定义的路径必须是已经检出的,而目录外部定义可以位于任意深度的外部目录,程序会自动创建中间目录,文件外部定义必须位于已经检出的工作拷贝中。
  • 文件的外部定义URL的须与其所添加的URL位于相同的版本库;跨版本库的文件外部定义并不支持。
  • 提交不会传递到目录外部定义,而包含文件外部定义的目录会提交所有外部文件的修改。

普通版本化文件和外部文件的区别。

  • 外部文件不能移动或删除;而应该删除svn:externals属性;然后,外部文件可以被复制。

其他事实。

  • 外部文件会在switched状态栏显示X

在外部定义中支持常见的shell转义规则。(issue 2461,客户端)

XXX: Need to document possible incompatibilies (see this thread

更多阅读

可以看Subversion图书的svn:externals小节。

目录树冲突的检测(客户端)

Subversion 1.6能够识别出一种新的冲突类别,称为“目录树冲突”。这种冲突位于目录结构级别,而不是文件内容。

包括删除本地已经修改的文件,对于本地删除文件的修改。在冲突被标示为解决之前,不能提交目录树冲突的相关文件和目录。

请注意,Subversion一直将重命名处理为“copy+delete”操作,所以文件重命名造成的目录树冲突只能被检测为文件的添加和删除,因此,有可能错报目录树的冲突。

为了利用目录树冲突检测,尝试提交在HEAD修订中已经删除的文件将会报错,在Subversion 1.5中,这被认为是正常的操作,潜在的导致了没有变更的修订版本。

详细阅读

Subversion图书的tree conflicts小节。

文件系统存储改进

Subversion 1.6包含了Berkeley DB和FSFS后端的改进,主要为了改进存储空间,可以显著产生更小的版本库,这些变更包括:

分享多个共有的表示(representations)(issue 2286服务器)

当使用多个分支,并在其间合并时,经常会有一些文件的行的历史包含相同的内容,在过去,Subversion会按照前一个版本的增量保存这些文件。Subversion 1.6会使用文件系统中已有的表示来处理重复的存储。根据版本库的大小,以及分支和合并的程度,这样可以节省20%的Berkeley DB版本库,或者15%的FSFS版本库空间。

FSFS版本库: 打包完全的碎片(shards) (服务器)

Subversion 1.5为FSFS版本库引入了将修订版本文件和修订属性文件的碎片(sharded)存放到多个目录。Subversion 1.6将这个概念进一步深入,允许完全粉碎的目录打包成一个文件。通过减少文件系统内部的碎块,打包的FSFS版本库显著的节省了空间,特别是如果包含了很多小的提交。使用一组碎片一个文件的方法,也可以让Subversion减少磁盘I/O的开销,充分挖掘操作系统缓存。

为了打包,可以对版本库运行svnadmin pack,一旦打包,将没有回到未打包状态的方法,只能通过Subversion 1.6或以后的服务器使用。

FSFS版本库:支持Memcached (服务器)

XXX: Memcached可以为FSFS版本库缓存数据。

额外的构建依赖:APR-Util ≥1.3 || ( APR-Util < 1.3 && APR_Memcache )

BDB版本库:反向增量 (服务器)

XXX

Ctypes Python绑定

Subversion 1.6为Subversion API引入了新的python绑定,新的绑定可以充分利用ctypes库提供的标准API,提供标准Subversion结构的面向对象的接口,这个绑定相比于原来的基于SWIG的绑定有以下优势:

  • 自动生成
  • 直接,无需特别的“转化”规则
  • 完全的python并且跨平台
  • 只要程序中使用的方法有兼容的定义,就可以向前后兼容
  • 高级的类可以用python化的方法简单的访问subversion功能

构建ctypes绑定会产生两种访问Subversion的方式。第一种是标准API的直接python转移,ctypes提供了一些基本的类型转化,并允许象在C代码中一样调用Subversion功能。新的绑定也引入了一组python类来实现Subversion特性的高级访问,这些类充分利用了python的特性,并尽可能的隐藏了C实现,使得不熟悉C API的python程序员可以简便的使用Subversion。

改进和bug修正

改进的交互式冲突解决(客户端)

dc, mc, tc选项。

这是一个使用命令行客户端的例子:

   $ svn up
   U    Makefile.in
   Conflict discovered in 'configure.ac'.
   Select: (p) postpone, (df) diff-full, (e) edit,
           (mc) mine-conflict, (tc) theirs-conflict,
           (s) show all options: s

     (e)  edit             - change merged file in an editor
     (df) diff-full        - show all changes made to merged file
     (r)  resolved         - accept merged version of file

     (dc) display-conflict - show all conflicts (ignoring merged version)
     (mc) mine-conflict    - accept my version for all conflicts (same)
     (tc) theirs-conflict  - accept their version for all conflicts (same)

     (mf) mine-full        - accept my version of entire file (even non-conflicts)
     (tf) theirs-full      - accept their version of entire file (same)

     (p)  postpone         - mark the conflict to be resolved later
     (l)  launch           - launch external tool to resolve conflict
     (s)  show all         - show this list

   Select: (p) postpone, (df) diff-full, (e) edit,
           (mc) mine-conflict, (tc) theirs-conflict,
           (s) show all options: mc
   G    configure.ac
   Updated to revision 36666.
   $ 

稀疏目录的排除选项

在Subversion 1.6,svn update--set-depth参数有了新的值—exclude,这个值告诉Subversion忽略工作拷贝中的目标,立刻起作用,直到以后再通知改变。在Subversion 1.6之前,一个目录很难从工作拷贝删除。如果不是借助Subversion命令删除一个目录,它会在下一次svn update回来。如果通过svn delete删除这个目录,它会一直在本地被标示为修改。(当然,如果你不小心提交了则另当别论。)1.6中新的排他机制修正了这些问题。

请注意,如果你排除了一个版本化的目录,其中包含了未版本化或本地有修改的文件,Subversion会优雅的处理这种情形,所有的文件都不能安全的删除,Subversion会保留他们,当然也包括所有中间目录。

更多阅读

看这篇博文

svnserve的日志支持(服务器)

XXX

mod_dav_svn中察看历史的新HTTP URI语法(服务器)

mod_dav_svn现在支持一个新的公共URI语法来检查较早版本的文件和目录。这样可以让用户无需Subversion客户端就可以访问历史,并让第三方工具更加简单(例如代码评审服务),直接与版本库交互而无需svn库。

http://host/repos/path?[p=PEG][&r=REV]

新的语法与svn命令行客户端的语法类似。简单的http://host/repos/path请求获取路径上的HEAD修订版本,而添加“p”查询参数,可以指明另外的peg修订版本,例如:

http://host/repos/path?p=38

...这与在命令行指明“path@38”类似。添加“r”查询参数则类似于命令行中的“-r”选项,让版本库从peg修订版本回溯到较早的操作修订版本:

http://host/repos/path?p=38&r=20

同命令行一样,peg修订版本缺省与HEAD相同,而操作修订版本则默认与peg修订版本相同。在线图书这个小节详细介绍了这些东西。

命令行客户端改进(客户端)

在命令行客户端有太多改进和新选项可以在这里列出来,除了本文已经提到的部分,下面是一些被认为是重要的,但是完整的列表请看CHANGES文件。

日志可以接受多个修订版本

svn log命令可以在一次调用中接受多个修订版本参数,-c和-r选项都支持。

   $ svn log -r36169 -r36171 http://svn.collab.net/repos/svn/
   ------------------------------------------------------------------------
   r36169 | sussman | 2009-02-26 14:46:44 -0800 (Thu, 26 Feb 2009) | 1 line

   ...log message omitted...
   ------------------------------------------------------------------------
   r36171 | joeswatosh | 2009-02-26 22:05:28 -0800 (Thu, 26 Feb 2009) | 20 lines

   ...log message omitted...
   $ svn log -c36169,36171 http://svn.collab.net/repos/svn/
   ------------------------------------------------------------------------
   r36169 | sussman | 2009-02-26 14:46:44 -0800 (Thu, 26 Feb 2009) | 1 line

   ...log message omitted...
   ------------------------------------------------------------------------
   r36171 | joeswatosh | 2009-02-26 22:05:28 -0800 (Thu, 26 Feb 2009) | 20 lines

   ...log message omitted...

--trust-server-cert选项

添加到svnsvnsync的选项,这样非交互式的操作也可以在未经过权威信任的自签名凭证下工作。

通过这个选项:
   $ svn log -r36364 https://svn.collab.net/repos/svn/trunk --trust-server-cert --non-interactive
   ------------------------------------------------------------------------
   r36364 | stylesen | 2009-03-06 13:11:20 +0530 (Fri, 06 Mar 2009) | 3 lines
   
   ...log message omitted...
   ------------------------------------------------------------------------
没有这个选项:
   $ svn log -r36364 https://svn.collab.net/repos/svn/trunk 
   Error validating server certificate for 'https://svn.collab.net':
    - The certificate is not issued by a trusted authority. Use the
      fingerprint to validate the certificate manually!
   Certificate information:
    - Hostname: svn.collab.net
    - Valid: from Sep 24 22:01:07 2007 GMT until Sep 23 22:01:07 2011 GMT
    - Issuer: sv, CollabNet, Brisbane, California, US
   (hostname@collab.net)
    - Fingerprint:
   AA:5B:74:B1:E2:7F:38:B3:2B:C2:B1:60:6E:01:BB:F5:7C:37:98:46
   (R)eject, accept (t)emporarily or accept (p)ermanently? t
   ------------------------------------------------------------------------
   r36364 | stylesen | 2009-03-06 13:11:20 +0530 (Fri, 06 Mar 2009) | 3 lines

   ...log message omitted...
   ------------------------------------------------------------------------

API变更、改进以及多种语言绑定 (客户端和服务器)

pre-lock钩子现在可以通过标准输出指明锁定令牌字符串;详细请看r32778。注意,当钩子用了这个特性,必须确保锁定令牌在版本库范围是唯一的。

Subversion 1.6有许多新的修正的API需要列出来,一般的API信息可以看Subversion API,如果你使用Subversion API开发第三方的客户端程序,你可能需要看接口的头文件来查看发生的变更。

一个常见的API变更是以前接受的recurse参数,现在升级为接受depth参数,为了接纳新的稀疏检出特性。

语言绑定几乎已经根据新API更新,尽管可能有些会有滞后。

Bug修正 (客户端和服务器)

大量bug被修正,细节请看CHANGES的1.6.0部分。

Subversion 1.4.x系列不再支持

Subversion 1.4.x线不再支持,这不是意味着1.4的安装已经要完蛋了;如果它工作良好,满足了你的需要,那很好。“不再支持”的意思是我们不再接受1.4.x版本的bug报告,也不会发布任何1.4.x的bug修正版本,除非有绝对安全隐患或数据丢失的bug。

新的依赖:SQLite

我们现在需要SQLite来构建服务器和客户端,我们推荐3.6.13或更新的版本,但是3.4.0已经足够。如果它位于tarball的根下,Subversion会尝试使用SQLite amalgamation,否则Subversion会在系统的常见位置寻找SQLite。你也可以通过传递给configure命令--with-sqlite来指明SQLite库或amalgamation的位置。