8. 二进制文件和行结束标记转换

在大多数情况下,Subversion 比 CVS 能更好的处理二进制文件。因为 CVS 使用 RCS,它只能存储已经修改的二进制文件的完整副本。但是 Subversion 使用二进制差异算法来表示文件的区别,不管文件是文本文件还是二进制文件。这意味着所有的文件是以增量的(压缩的)形式存放在版本库。

CVS 用户需要使用 -kb 选项来标记二进制文件,防止数据的混淆(因为关键字扩展和行结束符号的转换)。他们有时候会忘记这样做。

Subversion 使用更加异想天开的方法。第一,如果你不明确的告诉它(详情见第 6 节 “关键字替换”第 4.3 节 “行结束字符序列”)这样做,它不会做任何关键字扩展或行结束符号的转换操作。缺省情况下,Subversion 会把所有的数据看作字节串,所有的储存在版本库的文件都处于未转换的状态。

第二,Subversion 维护了一个内部的观念来区别一个文件是文本文件,还是二进制文件,但这个观念在工作副本非常重要。在执行 svn update 期间,Subversion 会对本地修改的文本文件执行基于上下文的合并,但是对二进制文件不会。

为了检测一个基于上下文的合并是可能的,Subversion 检测 svn:mime-type 属性。如果没有 svn:mime-type 属性,或者这个属性是文本的(例如 text/*),Subversion 会假定它是文本。否则 Subversion 认为它是二进制文件。Subversion 也会在执行 svn importsvn add 命令时通过运行一个二进制检测算法来帮助用户。这些命令会做出很好的猜测,然后(如果可能)设置添加文件的 svn:mime-type 属性(如果 Subversion 猜测错误,用户可以删除或手工编辑这个属性)。