本文根据原文r36726,由XXX (dead link) Subversion中文站的中文化翻译小组翻译,欢迎各位参与翻译工作,加入地址:https://code.google.com/archive/p/svncndoc/,参与翻译的志愿者包括XXX (dead link) rocksun。
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,详情看
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 $
Subversion 1.6对于svn:externals的使用增加了许多新的特性。包括:
如果svn:externals的描述指向了一个文件,这个文件会作为版本化条目加入到工作拷贝。
目录和文件外部定义有一些区别。
普通版本化文件和外部文件的区别。
其他事实。
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后端的改进,主要为了改进存储空间,可以显著产生更小的版本库,这些变更包括:
当使用多个分支,并在其间合并时,经常会有一些文件的行的历史包含相同的内容,在过去,Subversion会按照前一个版本的增量保存这些文件。Subversion 1.6会使用文件系统中已有的表示来处理重复的存储。根据版本库的大小,以及分支和合并的程度,这样可以节省20%的Berkeley DB版本库,或者15%的FSFS版本库空间。
Subversion 1.5为FSFS版本库引入了将修订版本文件和修订属性文件的碎片(sharded)存放到多个目录。Subversion 1.6将这个概念进一步深入,允许完全粉碎的目录打包成一个文件。通过减少文件系统内部的碎块,打包的FSFS版本库显著的节省了空间,特别是如果包含了很多小的提交。使用一组碎片一个文件的方法,也可以让Subversion减少磁盘I/O的开销,充分挖掘操作系统缓存。
为了打包,可以对版本库运行svnadmin pack
,一旦打包,将没有回到未打包状态的方法,只能通过Subversion 1.6或以后的服务器使用。
XXX: Memcached可以为FSFS版本库缓存数据。
额外的构建依赖:APR-Util ≥1.3 || ( APR-Util < 1.3 && APR_Memcache )
XXX
Subversion 1.6为Subversion API引入了新的python绑定,新的绑定可以充分利用ctypes库提供的标准API,提供标准Subversion结构的面向对象的接口,这个绑定相比于原来的基于SWIG的绑定有以下优势:
构建ctypes绑定会产生两种访问Subversion的方式。第一种是标准API的直接python转移,ctypes提供了一些基本的类型转化,并允许象在C代码中一样调用Subversion功能。新的绑定也引入了一组python类来实现Subversion特性的高级访问,这些类充分利用了python的特性,并尽可能的隐藏了C实现,使得不熟悉C API的python程序员可以简便的使用Subversion。
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会保留他们,当然也包括所有中间目录。
XXX
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...
添加到svn
和svnsync
的选项,这样非交互式的操作也可以在未经过权威信任的自签名凭证下工作。
$ 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... ------------------------------------------------------------------------
pre-lock钩子现在可以通过标准输出指明锁定令牌字符串;详细请看r872852。注意,当钩子用了这个特性,必须确保锁定令牌在版本库范围是唯一的。
Subversion 1.6有许多新的修正的API需要列出来,一般的API信息可以看Subversion API,如果你使用Subversion API开发第三方的客户端程序,你可能需要看接口的头文件来查看发生的变更。
一个常见的API变更是以前接受的recurse参数,现在升级为接受depth参数,为了接纳新的稀疏检出特性。
语言绑定几乎已经根据新API更新,尽管可能有些会有滞后。
Subversion 1.4.x线不再支持,这不是意味着1.4的安装已经要完蛋了;如果它工作良好,满足了你的需要,那很好。“不再支持”的意思是我们不再接受1.4.x版本的bug报告,也不会发布任何1.4.x的bug修正版本,除非有绝对安全隐患或数据丢失的bug。
我们现在需要SQLite来构建服务器和客户端,我们推荐3.6.13或更新的版本,但是3.4.0已经足够。如果它位于tarball的根下,Subversion会尝试使用SQLite
amalgamation,否则Subversion会在系统的常见位置寻找SQLite。你也可以通过传递给configure
命令--with-sqlite
来指明SQLite库或amalgamation的位置。