我有一些.sql文件,我只是第一次将其推送到github。但是,当我查看提交时,它说:
BIN WebRole/Sql/Database.sql View
Binary file not shown
有人可以告诉我为什么说“未显示二进制文件”
Answers:
仅此扩展还不足以让GitHub查看它是否是文本文件。
因此,它必须查看其内容。
并且如“为什么Git将此文本文件视为二进制文件? ”中所述,其内容可能没有包含足够的ascii字符来猜测它是文本文件。
您可以使用.gitattributes文件明确指定a.sql
应该是文本,而不是二进制。
*.sql diff
更新2018:正如我在“ UTF-8编码不适用于UTF-8编码的文档”中提到的那样,Git 2.18 .gitattributes具有一个新working-tree-encoding
属性。
因此,如Rusi的答案所示:
*.sql text working-tree-encoding=UTF-16LE eol=CRLF
如果这些文件是由Microsoft SQL Management Studio生成的(或使用的MS SQL Server管理工具版本中的任何名称),则其保存的文件将以UCS-2(或UTF-16)进行编码-两字节编码,在Git看来确实不是文本
您可以在“ Git说“ Binary files a… and b… differ
”打开*.reg
文件”中看到一个示例。
如“将文件设置为git中的非二进制文件”中所述:
“为什么Git将我的文件标记为二进制文件?” 答案是因为它在文件的前8000个字符中的某个位置看到NUL(0)字节。
通常,发生这种情况是因为文件被保存为UTF-8以外的其他格式。因此,它很可能另存为UCS-2,UCS-4,UTF-16或UTF-32。使用ASCII字符时,所有这些字符都嵌入了NUL字符
正如Neo在评论中提到的那样(以及Git为什么将此文本文件视为二进制文件?):
您可以通过从“文件”菜单的“高级保存选项”菜单项中选择“带有签名的UTF-8编码”,将SSMS中已保存文件的编码更改为UTF-8。
iso
命令dos2unix的选项' ',以查看是否有帮助:computerhope.com/unix/dos2unix.htm
使用链接问题的可接受答案和其他一些评论,我提出了此解决方案,该问题可以在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)
}
$Contents = Get-Content -LiteralPath $MyPath
这个旧问题有了新的答案-working-tree-encoding
正是由于这些原因,git最近增加了一个选择。请参见gitattributes文档[请确保您的手册页匹配,因为这是相当新的!]
找出sql文件的编码,例如 file
如果(说)它的utf-16在Windows计算机上没有bom,则添加到您的gitattributes文件中
*.sql text working-tree-encoding=UTF-16LE eol=CRLF
如果utf-16 little endinan(with bom)做成
*.sql text working-tree-encoding=UTF-16 eol=CRLF
对于那些在2008 R2的SSMS中遇到此问题的人(可以,仍然可以!),您可以按以下方式设置默认编码:
位置可能有所不同。这是Windows 7 64位默认安装所使用的目录。
这用作新.SQL文件的模板。使用所需的编码(在我的情况下为Windows-1252,带有Windows行尾)保存它。“保存”按钮右侧的箭头为您提供了多种编码方式。
您需要与开发团队协调编码以避免git和SSMS的麻烦。
C:\Program Files (x86)\Microsoft SQL Server\110\Tools\Binn\ManagementStudio\SqlWorkbenchProjectItems\Sql
C:\Program Files (x86)\Microsoft SQL Server\130\Tools\Binn\ManagementStudio\SqlWorkbenchProjectItems\Sql
解决此问题的方法是强制文件使用8位编码。您可以运行此PowerShell脚本来更改当前目录及其子目录中所有.SQL文件的编码。
Get-ChildItem -Recurse *.sql | foreach {
$FileName = $_.FullName;
[System.Io.File]::ReadAllText($FileName) | Out-File -FilePath $FileName -Encoding UTF8;
}
[System.IO.File]::WriteAllLines($MyPath, $MyFile, $Utf8NoBomEncoding)