This text is a work in progress—highly subject to change—and may not accurately describe any released version of the Apache™ Subversion® software. Bookmarking or otherwise referring others to this page is probably not such a smart idea. Please visit http://www.svnbook.com/ for stable versions of this book.
在通常情况下, 与 CVS 相比, Subversion 能够更加高效地处理二进制文件, 因为 CVS 使用了 RCS, 它只能存放被修改的二进制文件的完整副本. 而对于 Subversion 而言, 无论文件是否包含二进制数据, 它都能使用二进制差异算法 表示文件之间的差异, 这就意味着所有被修改的文件在仓库中都只存放差异 部分 (而且还是压缩过的).
为了防止二进制文件发生错乱 (由于关键字展开和行结束符转换), CVS
用户必须为它们指定选项 -kv
, 但用户有时候会忘记这件
事.
Subversion 采取了更为偏执的路线. 首先, 除非用户显式地要求 Subversion, 否则的话它不会执行任何关键字展开或行结束符转换 (更多的 信息见 “关键字替换”一节 和 “行结束标记”一节). 默认情况下, Subversion 把所有文件的内容都看成是字节序列, 而且在把文件存放到仓库 中时不会做任何转换.
第二, 对于某个文件是 “文本” 文件, 还是 “二进制” 文件, Subversion 有它自己的一套内部概念, 但这套 概念 只在 工作副本中才会显现出来. 执行 svn update 时, Subversion 将为含有本地修改的文本文件执行基于上下 文的合并, 但不会对含有本地修改的二进制文件做相同的合并操作.
为了判断是否可以对某个文件执行基于上下文的合并, Subversion 将查看
文件的 svn:mime-type
属性. 如果文件没有设置属性
svn:mime-type
, 或者属性值表示文件的 MIME 类型是
文本的 (例如 text/*
), Subversion 就会认为它是个文本
文件; 否则的话则认为它是二进制文件. 当用户执行 svn
import 和 svn add 时, Subversion 也会
通过自己的二进制检测算法来判断文件的 MIME 类型, 如果 Subversion 猜出
了文件的 MIME 类型, 它 (可能) 会自动地为新增的文件设置
svn:mime-type
属性值. (如果 Subversion 猜错了,
用户总是可以删除或手动设置 svn:mime-type
属性.)