如何告诉Subversion(svn)将文件视为二进制文件?
通过使用以下方法,可以手动将位于存储库中的文件标识为二进制文件:
svn propset svn:mime-type application/octet-stream
这通常不是必需的,因为Subversion将在首次添加文件时尝试确定文件是否为二进制文件.如果Subversion错误地将某种类型标记为"文本",则应将其视为二进制,则可以配置Subversion的自动道具功能以使用非文本MIME类型自动标记该文件.无论文件上配置的属性如何,Subversion仍然以存储库中的二进制格式存储文件.
如果Subversion将MIME类型标识为"文本"类型,则它会启用二进制文件上不可用的某些功能,例如svn diff和svn blame.它还允许自动行结束转换,可在逐个客户端的基础上进行配置.
有关更多信息,请参阅Subversion如何处理二进制文件?
从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
基本上,您必须将mime类型设置为octet-stream:
svn propset svn:mime-type application/octet-stream
如果'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
例如:
svn propset svn:mime-type image/png foo.png