如何告诉Subversion将一个文件视为二进制文件?

67

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

10个回答

84

通过使用以下方法,可以手动将存储库中位于文件标识为二进制:

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

通常情况下,这是不必要的,因为当文件第一次添加时,Subversion会尝试确定它是否是二进制文件。如果Subversion错误地将某种类型标记为“文本”,而在实际上应将其视为二进制文件,则可以配置Subversion的auto-props功能,以自动标记该文件为非文本MIME类型。无论文件配置了哪些属性,Subversion仍会在存储库中以二进制格式存储文件。

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

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


在实际操作中,我更愿意为文件指定特定的(二进制)MIME类型,而不是通用的application/octet-stream,至少可以通过file --mime-type -b filename或在线查找文件扩展名来找到它。 - chrstphrchvz

21
Subversion book的第367页开始阅读:
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猜错了,用户始终可以删除或手动编辑此属性。)
手动编辑将由用户自己完成。
svn propset svn:mime-type some/type filename.extension

1
你如何在导入时处理这个问题?也就是说,在文件进入存储库之前?我的使用情况是,由于不一致的行尾符,svn无法导入一个文件。但这只是测试数据,所以该文件故意具有不一致的行尾符。 - Robert P. Goldman

15

基本上,您需要将MIME类型设置为octet-stream:

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

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

8

例如:

svn propset svn:mime-type image/png foo.png

4
虽然Subversion尝试自动检测文件是否为二进制文件,但您可以使用svn propset覆盖mime-type。 例如,svn propset svn:mime-type application/octet-stream example.txt。这将使您的文件作为字节集合而不是文本文件进行操作。另请参阅svn手册上的文件可移植性

只是为了更新您的自动检测算法链接: http://subversion.apache.org/faq.html#binary-files - oldNoakes

3

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


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

2

0
通常情况下,它会自动为您执行此操作,但如果没有,您需要查看文件属性和propset。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接