本文档旨在描述 Apache™ Subversion® 的 1.7.x 系列。如果您运行的是其他版本的 Subversion,强烈建议您访问 https://svnbook.subversion.org.cn/ 并查阅适合您 Subversion 版本的文档。
从最一般的意义上来说,Subversion 处理二进制文件的方式比 CVS 更优雅。由于 CVS 使用 RCS,它只能存储不断变化的二进制文件的连续完整副本。然而,Subversion 使用二进制差异算法来表达文件之间的差异,无论它们包含文本数据还是二进制数据。这意味着所有文件都以差异(压缩)形式存储在存储库中。
CVS 用户必须使用 -kb
标志标记二进制文件,以防止数据被破坏(由于关键字扩展和换行符翻译)。他们有时会忘记这样做。
Subversion 采取了更谨慎的路线。首先,它永远不会执行任何类型的关键字或换行符翻译,除非您明确要求它这样做(有关更多详细信息,请参阅 名为“关键字替换”的部分 和 名为“行尾字符序列”的部分)。默认情况下,Subversion 将所有文件数据视为字面字节字符串,并且文件始终以未翻译状态存储在存储库中。
其次,Subversion 保持一个内部概念,即文件是 “文本” 还是 “二进制” 数据,但这个概念 仅 存在于工作副本中。在 svn update 期间,Subversion 将对本地修改的文本文件执行上下文合并,但不会尝试对二进制文件执行此操作。
为了确定上下文合并是否可行,Subversion 会检查 svn:mime-type
属性。如果文件没有 svn:mime-type
属性,或者具有文本 MIME 类型(例如,text/*
),Subversion 会假设它是文本。否则,Subversion 会假设该文件是二进制文件。Subversion 还通过在 svn import 和 svn add 命令中运行二进制检测算法来帮助用户。这些命令将做出一个好的猜测,然后(可能)在要添加的文件上设置一个二进制 svn:mime-type
属性。(如果 Subversion 猜错了,用户始终可以删除或手动编辑该属性。)