我有一些.sql文件,我刚刚第一次推送到github。但是,当我查看提交时,它会说:
BIN WebRole/Sql/Database.sql View
Binary file not shown
有人可以告诉我它为什么说"二进制文件没有显示"
答案 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
属性。
因此,如Rusi的answer所示:
*.sql text working-tree-encoding=UTF-16LE eol=CRLF
如果这些文件是由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中遇到此问题的人(是的,仍然!),您可以按如下方式设置默认编码:
地点可能有所不同。这是Windows 7 64位上的默认安装使用的目录。
这用作新.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
如果(说)在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;
}