Software Foundation, Licensed under
the
Apache
License, Version 2.0
. Apache, Apache Subversion, and
the Apache feather logo are trademarks of The Apache Software
Foundation. Subversion and the Apache Subversion logo are
registered trademarks of The Apache Software Foundation.
Privacy policy
Subversion 1.6发布说明
本文根据原文r36726,由
XXX (dead link) Subversion中文站
的中文化翻译小组翻译,欢迎各位参与翻译工作,加入地址:
https://code.google.com/archive/p/svncndoc/
,参与翻译的志愿者包括
XXX (dead link) rocksun
。
Subversion 1.6的新东西
改进的认证数据处理
版本库根的相对URL
svn:externals
的改进
目录树冲突的检测
文件系统存储改进
Ctypes Python绑定
改进的交互式冲突解决
稀疏目录的排除选项
svnserve的日志支持
察看历史的新HTTP URI语法
命令行客户端改进
API变更、改进以及多种语言绑定
超过65项新的bug修正和提升
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 Client
1
Minimum Server
Minimum Repository
FSFS Packing
Tree Conflicts
可以用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
,详情看
外部文件会在switched状态栏显示
X
。
Subversion 1.6能够识别出一种新的冲突类别,称为“目录树冲突”。这种冲突位于目录结构级别,而不是文件内容。
包括删除本地已经修改的文件,对于本地删除文件的修改。在冲突被标示为解决之前,不能提交目录树冲突的相关文件和目录。
请注意,Subversion一直将重命名处理为“copy+delete”操作,所以文件重命名造成的目录树冲突只能被检测为文件的添加和删除,因此,有可能错报目录树的冲突。
为了利用目录树冲突检测,尝试提交在HEAD修订中已经删除的文件将会报错,在Subversion 1.5中,这被认为是正常的操作,潜在的导致了没有变更的修订版本。
Subversion图书的
tree conflicts
小节。
Subversion 1.6包含了Berkeley DB和FSFS后端的改进,主要为了改进存储空间,可以显著产生更小的版本库,这些变更包括:
表示(representations)共享
FSFS inode打包
FSFS版本库:支持Memcached
BDB版本库:反向增量
分享多个共有的表示(representations)(
issue 2286
,
服务器
)
当使用多个分支,并在其间合并时,经常会有一些文件的行的历史包含相同的内容,在过去,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或以后的服务器使用。
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。
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 (dead link) 博文
。
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修订版本相同。在线图书
这个小节
详细介绍了这些东西。
$ 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 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
(
[email protected])
- 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更新,尽管可能有些会有滞后。
我们现在需要
SQLite
来构建服务器和客户端,我们推荐3.6.13或更新的版本,但是3.4.0已经足够。如果它位于tarball的根下,Subversion会尝试使用SQLite
amalgamation
,否则Subversion会在系统的常见位置寻找SQLite。你也可以通过传递给
configure
命令
--with-sqlite
来指明SQLite库或amalgamation的位置。