67

如何告诉 Subversion (svn) 将文件视为二进制文件?

4

10 回答 10

84

可以使用以下方法手动将存储库中的文件识别为二进制文件

svn propset svn:mime-type application/octet-stream <filename>

这通常不是必需的,因为 Subversion 会在首次添加文件时尝试确定文件是否为二进制文件。如果 Subversion 在应该将其视为二进制时错误地将某个类型标记为“文本”,则可以配置 Subversion 的auto-props 功能以使用非文本 MIME 类型自动标记该文件。无论文件上配置的属性如何,Subversion 仍将文件以二进制格式存储在存储库中。

如果 Subversion 将 MIME 类型识别为“文本”类型,它会启用二进制文件中不可用的某些功能,例如svn diffsvn blame。它还允许自动行结束转换,可在逐个客户端的基础上进行配置。

有关更多信息,请参阅Subversion 如何处理二进制文件?

于 2008-09-16T16:07:42.427 回答
21

来自Subversion 书的第 367 页

在最一般的意义上,Subversion 比 CVS 更优雅地处理二进制文件。因为 CVS 使用 RCS,它只能存储不断变化的二进制文件的连续完整副本。然而,Subversion 使用二进制差分算法表示文件之间的差异,无论它们包含文本数据还是二进制数据。这意味着所有文件都以差异方式(压缩)存储在存储库中。

CVS 用户必须用 -kb 标志标记二进制文件,以防止数据出现乱码(由于关键字扩展和行尾翻译)。他们有时会忘记这样做。

Subversion 走的是更加偏执的路线。首先,它从不执行任何类型的关键字或行尾翻译,除非您明确要求它这样做(有关详细信息,请参阅“关键字替换”部分和“行尾字符序列”部分)。默认情况下,Subversion 将所有文件数据视为文字字节字符串,并且文件始终以未翻译状态存储在存储库中。

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

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

手工编辑将由

svn propset svn:mime-type some/type filename.extension
于 2008-09-16T15:53:01.603 回答
15

基本上,您必须将 mime 类型设置为八位字节流:

svn propset svn:mime-type application/octet-stream <filename>
于 2008-09-16T15:51:03.183 回答
13

如果 'svn add' 猜到了不正确的类型并给你一个类似下面的错误:

svn: E200009: File 'qt/examples/dialogs/configdialog/images/config.png' has inconsistent newlines
svn: E135000: Inconsistent line ending style

那么解决方法是添加没有属性的文件,然后在第二步中设置属性:

svn add --no-auto-props qt/examples/dialogs/configdialog/images/config.png
svn propset svn:mime-type image/png qt/examples/dialogs/configdialog/images/config.png
于 2012-06-13T17:57:20.093 回答
8

例如:

svn propset svn:mime-type image/png foo.png
于 2008-09-16T15:50:02.030 回答
4

尽管 Subversion 尝试自动检测文件是否为二进制文件,但您可以使用svn propset覆盖 mime 类型。例如,svn propset svn:mime-type application/octet-stream example.txt。这将使您的文件充当字节集合而不是文本文件。另请参阅有关文件可移植性的 svn 手册。

于 2008-09-16T15:59:35.847 回答
3

如果在 Windows 中使用 tortoise svn,请右键单击该文件并转到属性。单击新建并添加类型为 svn:mime-type 的新属性。对于价值投入:application/octet-stream

于 2008-09-16T15:53:07.030 回答
2

根据Subversion FAQ,您可以使用 svn propset 将svn:mime-type属性更改为application/octet-stream

于 2008-09-16T15:50:48.317 回答
2

svn 寻找一个 mime 类型的属性,如果它不存在则猜测它是文本。您可以明确设置此属性,请参阅http://svnbook.red-bean.com/en/1.5/svn.forcvs.binary-and-trans.html

于 2008-09-16T15:50:55.553 回答
0

它通常默认为您执行此操作,但如果不是,您需要查看文件属性和 propset。

于 2008-09-16T15:52:31.307 回答