在大多数情况下,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 import 和 svn
add 命令时通过运行一个二进制检测算法来帮助用户。这些命令会做出很好的猜测,然后(如果可能)设置添加文件的
svn:mime-type
属性(如果 Subversion 猜测错误,用户可以删除或手工编辑这个属性)。