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 importsvn add 时, Subversion 也会 通过自己的二进制检测算法来判断文件的 MIME 类型, 如果 Subversion 猜出 了文件的 MIME 类型, 它 (可能) 会自动地为新增的文件设置 svn:mime-type 属性值. (如果 Subversion 猜错了, 用户总是可以删除或手动设置 svn:mime-type 属性.)