二进制文件与转换
在通常情况下, 与 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
属性.)