Subversion 1.6发布说明
官方位置为:http://subversion./svn_1.6_releasenotes.zh.html
本文根据原文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.)。
本文描述了主要的变更,完整的列表可以看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程序同时是客户端和服务器。 |
命令行输出的变更
尽管我们希望尽可能让命令行程序的的输出与以前版本保持兼容,但是还是要添加一些信息,这会破坏一些精确依赖输出的脚本。
改善的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属性;然后,外部文件可以被复制。
其他事实。
目录树冲突的检测(客户端)
Subversion 1.6能够识别出一种新的冲突类别,称为“目录树冲突”。这种冲突位于目录结构级别,而不是文件内容。
包括删除本地已经修改的文件,对于本地删除文件的修改。在冲突被标示为解决之前,不能提交目录树冲突的相关文件和目录。
请注意,Subversion一直将重命名处理为“copy+delete”操作,所以文件重命名造成的目录树冲突只能被检测为文件的添加和删除,因此,有可能错报目录树的冲突。
为了利用目录树冲突检测,尝试提交在HEAD修订中已经删除的文件将会报错,在Subversion 1.5中,这被认为是正常的操作,潜在的导致了没有变更的修订版本。
文件系统存储改进
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 )
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会保留他们,当然也包括所有中间目录。
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./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./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选项
添加到svn 和svnsync 的选项,这样非交互式的操作也可以在未经过权威信任的自签名凭证下工作。
通过这个选项:
$ svn log -r36364 https://svn./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./repos/svn/trunk Error validating server certificate for 'https://svn.': - The certificate is not issued by a trusted authority. Use the fingerprint to validate the certificate manually! Certificate information: - Hostname: svn. - Valid: from Sep 24 22:01:07 2007 GMT until Sep 23 22:01:07 2011 GMT - Issuer: sv, CollabNet, Brisbane, California, US (hostname@) - 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.11或更新的版本,但是3.4.0已经足够。如果它位于tarball的根下,Subversion会尝试使用SQLite amalgamation,否则Subversion会在系统的常见位置寻找SQLite。你也可以通过传递给configure 命令--with-sqlite 来指明SQLite库或amalgamation的位置。
TAG: Subversion subversion 中文 发布说明
|