本文档旨在描述 Subversion 1.1 版本。如果您正在运行更新版本的 Subversion,我们强烈建议您访问 https://svnbook.subversion.org.cn/ 并查阅适合您的 Subversion 版本的书籍。

二进制文件和翻译

从最普遍的意义上来说,Subversion 比 CVS 更优雅地处理二进制文件。由于 CVS 使用 RCS,它只能存储更改的二进制文件的连续完整副本。但 Subversion 在内部使用二进制差异算法来表达文件之间的差异,无论它们包含文本数据还是二进制数据。这意味着所有文件都以差异(压缩)方式存储在存储库中,并且总是通过网络发送较小的差异。

CVS 用户必须使用-kb标记二进制文件,以防止数据被破坏(由于关键字扩展和行尾转换)。他们有时会忘记这样做。

Subversion 采取了更谨慎的路线:首先,除非您明确要求它执行任何类型的关键字或行尾转换(有关更多详细信息,请参见 名为“svn:keywords”的部分名为“svn:eol-style”的部分),否则它永远不会执行任何类型的关键字或行尾转换。默认情况下,Subversion 将所有文件数据视为字面字节字符串,并且文件始终以未翻译状态存储在存储库中。

其次,Subversion 保持一个内部概念,即文件是“文本”还是“二进制”数据,但这个概念存在于工作副本中。在 svn update 期间,Subversion 将对本地修改的文本文件执行上下文合并,但不会尝试对二进制文件执行合并。

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