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

14ifxucb  于 11个月前  发布在  Git
关注(0)|答案(7)|浏览(153)

我有一些.sql文件,我只是第一次推到github。然而,当我看提交它说:

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

字符串
有人能告诉我为什么它说“二进制文件未显示”

mrzz3bfm

mrzz3bfm1#

仅扩展名不足以让GitHub判断它是否是一个文本文件。
因此,它必须看它的内容。
正如在“Why does Git treat this text file as a binary file?“中提到的,它的内容可能没有包含足够的字符来猜测它是文本文件。
您可以使用.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在评论中所说:
如果这些文件是由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在评论中提到的(以及在Why does Git treat this text file as a binary file?中):
您可以通过从“文件”菜单中的“高级保存选项”菜单项中选择编码“带签名的UTF-8”,将SSMS中已保存文件的编码更改为UTF-8。

uqcuzwp8

uqcuzwp82#

从2.18版本开始,git就有了一个选项working-tree-encoding,这正是出于这些原因。参见gitattributes文档。
[Make确保你的git版本(* 和所有使用repo的人 *)至少是2.18]
找出sql文件的编码,例如使用file
如果(比如说)它的UTF-16没有bom在windows机器上,然后添加到你的gitattributes文件

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

字符串
如果utf-16小endinan(与bom)使它

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

zengzsys

zengzsys3#

使用链接问题的公认答案和其他一些评论,我想出了这个问题的解决方案,它在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)
}

字符串

iaqfqrcu

iaqfqrcu4#

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

  • 找到目录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行结束符)。“保存”按钮右边的箭头给你一个编码的选择。
您需要与开发团队协调编码,以避免git和SSMS的麻烦。

kyks70gy

kyks70gy5#

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

rmbxnbpk

rmbxnbpk6#

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

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

字符串

vkc1a9a2

vkc1a9a27#

我使用Microsoft SQL Server Management Studio 19.1 Generate Scripts向导从数据库导出SQL命令,并将生成的.sql文件提交到Github。
默认情况下,向导将.sql文件写入Unicode Text。这导致Github认为该文件是二进制格式。
在我的例子中,简单的修复方法是将向导中导出的格式更改为ANSI Text,而不是Save as选择中的Unicode Text。现在Github能够将文件识别为纯文本,并在内容上提供diff s。
无需PowerShell命令,无需运行后处理文件。只需将文本导出为ANSI,Github就会很高兴。


的数据

相关问题