为什么git认为我的.sql文件是二进制文件?

时间:2015-01-26 06:40:18

标签: git github

我有一些.sql文件,我刚刚第一次推送到github。但是,当我查看提交时,它会说:

BIN  WebRole/Sql/Database.sql View
Binary file not shown

有人可以告诉我它为什么说"二进制文件没有显示"

6 个答案:

答案 0 :(得分:68)

单独的扩展程序不足以让GitHub查看它是否是文本文件 所以必须看一下它的内容。

正如“Why does Git treat this text file as a binary file?”中所述,其内容可能不包含足够的ascii字符,因此猜测它是文本文件。

您可以使用.gitattributes file明确指定.sql应该是文本,而不是二进制文件。

*.sql diff

更新2018:正如我在“Utf-8 encoding not working on utf-8 encoded document”中提到的,Git 2.18 .gitattributes有一个新的working-tree-encoding属性。
因此,如Rusianswer所示:

*.sql text working-tree-encoding=UTF-16LE eol=CRLF

kostix添加了the comments

  

如果这些文件是由Microsoft SQL Management Studio生成的(或者您正在使用的MS SQL Server管理工具版本中调用的那些文件),则它保存的文件将以UCS-2(或UTF-16)编码 - 一个双字节编码,这确实不是Git眼中的文本

您可以在“Git says “Binary files a… and b… differ” on for *.reg files

中查看示例

如“Set file as non-binary in git”中所述:

  

“为什么Git将我的文件标记为二进制文件?”答案是因为它在文件的前8000个字符内的某处看到了NUL(0)字节   通常,这是因为文件被保存为UTF-8以外的其他内容。因此,它可能被保存为UCS-2,UCS-4,UTF-16或UTF-32。所有这些都在使用ASCII字符时嵌入了NUL字符


由于Neo提及in the comments(以及Why does Git treat this text file as a binary file?):

  

您可以通过从“文件”菜单中的“高级保存选项”菜单项中选择编码“带签名的UTF-8”,将SSMS中已保存文件的编码更改为UTF-8。

答案 1 :(得分:4)

对于那些在2008 R2的SSMS中遇到此问题的人(是的,仍然!),您可以按如下方式设置默认编码:

  • 找到目录C:\ Program Files(x86)\ Microsoft SQL Server \ 100 \ Tools \ Binn \ VSShell \ Common7 \ IDE \ SqlWorkbenchProjectItems \ Sql

地点可能有所不同。这是Windows 7 64位上的默认安装使用的目录。

  • 在此位置,添加(或编辑)空SQL文件SQLFile.sql。

这用作新.SQL文件的模板。使用您需要的编码保存它(在我的例子中,Windows-1252带有Windows行结尾)。 ' Save'右边的箭头。按钮为您提供编码选择。

您需要与开发团队协调编码,以避免git和SSMS的麻烦。

答案 2 :(得分:4)

使用链接问题和其他一些意见的公认答案,我提出了此解决方案,该问题正在运行并且可以在Win10上运行

$Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $False
Get-ChildItem -Recurse *.sql | foreach {
    $MyPath = $_.FullName;
    $Contents = Get-Content $MyPath
    [System.IO.File]::WriteAllLines($MyPath, $Contents, $Utf8NoBomEncoding)
}

答案 3 :(得分:3)

这个老问题有了一个新答案-正是由于这些原因,git最近增加了一个选项working-tree-encoding。 请参阅gitattributes文档 [请确保您的手册页匹配,因为这是很新的!]

例如使用file

找出sql文件的编码。

如果(说)在Windows机器上不带Bom的utf-16,则将其添加到您的gitattributes文件中

*.sql text working-tree-encoding=UTF-16LE eol=CRLF

如果使用utf-16小菊苣(含Bom)制成

*.sql text working-tree-encoding=UTF-16 eol=CRLF

答案 4 :(得分:2)

这是一个使用SSMS 2012的快速解决方法。在工具=>下options => environment =>国际设置,如果你改变语言来自"英语" to"与Microsoft Windows相同" (它可能会提示您重新启动SSMS以使更改生效),它将不再使用UTF-16作为新文件的默认编码 - 我创建的所有 new 文件都有Codepage 1252(file = >高级保存选项)现在,这是一个8位编码方案,似乎没有Git Diff

的问题

答案 5 :(得分:1)

解决此问题的方法是强制文件使用8位编码。您可以运行此PowerShell脚本来更改当前目录及其子目录中所有.SQL文件的编码。

Get-ChildItem -Recurse *.sql | foreach {
  $FileName = $_.FullName;
  [System.Io.File]::ReadAllText($FileName) | Out-File -FilePath $FileName -Encoding UTF8;
}