SVN Diff:为什么有些文件标记为二进制

18

直接相关:svn diff:文件标记为二进制类型 (根据答案上的评论)

为什么我的SVN客户端会将某些文件标记为二进制文件?

具体来说,当使用TortoiseSVN时,.sql的属性为svn:mime-type = application/octet-stream

我检查了右键单击 > Tortoise菜单 > 设置 > 常规 > Subversion配置文件,[miscellany][auto-props]中没有任何未注释的内容,那么决定是从哪里来的呢?

从我在相关帖子中看到的内容中可以看出,我可以通过删除受影响文件上的属性或通过配置/设置全局更改新文件的行为来“修复它”,但是否有一种“简单”的方法来同时对所有受影响的文件执行这两个操作呢?

有点相关:


天啊,移除 mime-type 属性(假设它默认为 text/plain)会显示一堆 NUL 字符垃圾,每隔一个字符就会出现。我的情况不适用吗?TortoiseMerge 查看器可以很好地进行比较... - drzaus
1
我遇到了完全相同的问题... .sql 文件明明是 text/plain 类型,没有设置 auto-props,但却被上传为 application/octet-stream。很遗憾没有人提供答案 :( - brazilianldsjaguar
2个回答

18

我在我的特定情况下发现了问题:

一个开发人员保存了他用于新脚本的模板.sql文件。该文件以某种方式以UCS-2(或Unicode)编码保存。每当他添加文件时,TortoiseSVN会确定它是二进制文件。通过将编码切换为UTF-8,模板及由此生成的文件可以正确地添加为text/plain

附加信息(编辑)

我找到了可能是罪魁祸首的东西。使用GUI生成一些脚本时,SQL Server Management Studio在查询窗口中将它们写成Unicode。如果文件被保存,它也将被保存为Unicode。有趣的是,通过文件>新建打开的文件不会这样保存。2007年关于这个问题已经向Microsoft提出了问题(在这里找到),但显然还没有解决。


那将是一个痛苦的追踪过程...但值得一试。 - drzaus
我之所以能够发现这是因为Notepad ++具有一个漂亮的“编码...”菜单,允许您查看当前并更改编码。 - brazilianldsjaguar
是的,Notepad++使得单个文件的修复变得容易,但如果你有很多文件,似乎需要一个批处理脚本(或者这个)将是必要的。 - drzaus
1
同意。为了完整起见,我已添加更多信息(例如,文件最初可能是如何变成UCS-2编码的)。 - brazilianldsjaguar

7
以下是解决此问题的快速方法:
notepad %APPDATA%\Subversion\config

向下滚动并取消注释此行:

enable-auto-props = yes

在 [auto-props] 下方添加以下行:
*.sql = svn:mime-type=text/plain

现在,当您将.SQL文件添加到SVN时,它们将自动标记为文本(而不是八位流)。
编辑:删除了不必要的行结尾文件更改。

有趣。我也做了同样的事情,唯一不同的是我的自动属性设置为*.sql = svn:mime-type=application/x-sql(不确定为什么)。将其更改为您的建议使提交时它以我想要的方式显示。但是我要指出,svn:eol-style=native是不必要的,并且实际上正在更改磁盘上的文件。 - drzaus
我会将其标记为答案,但似乎对现有文件没有帮助。 - drzaus
2
现有的文件必须被检出,其属性被更改,然后再次检入。但这实际上是一个不同的问题。 - user95209
SQL的正确且已注册的IANA MIME类型是application/sql,根据RFC 6922。不确定这对TortoiseSVN的行为会产生什么影响。 - rmalayter
我唯一能够在“svn diff”上显示JSON和SQL的方法是使用“text/plain”作为我的MIME类型。当我尝试查看差异时,它们各自的应用程序MIME类型会为我生成以下消息:“无法显示:文件标记为二进制类型”。 - Erkin Djindjiev

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