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


Answers:


98

仅此扩展还不足以让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

正如kostix评论中添加

如果这些文件是由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。


18
@Alan,如果这些文件是由Microsoft SQL Management Studio生成的(或使用的MS SQL Server管理工具版本中的任何名称),则其保存的文件将以UCS-2(或UTF-16)进行编码-两字节编码,在Git看来确实不是文本。
kostix

16
您可以通过从“文件”菜单的“高级保存选项”菜单项中选择“带有签名的UTF-8编码”,将SSMS中已保存文件的编码更改为UTF-8。来源:stackoverflow.com/a/21170043/197591

2
@Neo好点。我已将您的评论包含在答案中,以提高知名度。
VonC

7
如果您要在Windows中运行Git Bash,并且不想覆盖对文件所做的任何更改,那么另一个巧妙的技巧就是键入“ dos2unix * .sql”。这样会将所有UCS2文件转换为UTF8,从而允许git识别文本。
Slothario '17

1
@thebfactor检查该iso命令dos2unix的选项' ',以查看是否有帮助:computerhope.com/unix/dos2unix.htm
VonC

9

使用链接问题的可接受答案和其他一些评论,我提出了此解决方案,该问题可以在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)
}

1
有趣。我看到使用Powershell。+1
VonC

就我而言,Get-Content需要一个标记来处理文件名中的方括号(例如[dbo]):$Contents = Get-Content -LiteralPath $MyPath
Jeremy Murray,

7

这个旧问题有了新的答案-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

1
有趣。已投票。我已经在我的网站上引用了您的答案(stackoverflow.com/a/28145968/6309)。:我已经记录了新的属性,2018年5月的混帐2.18 stackoverflow.com/a/50435869/6309
VonC

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行尾)保存它。“保存”按钮右侧的箭头为您提供了多种编码方式。

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


2
我在C:\Program Files (x86)\Microsoft SQL Server\110\Tools\Binn\ManagementStudio\SqlWorkbenchProjectItems\Sql
Aaron D

1
和SSMS2016:C:\Program Files (x86)\Microsoft SQL Server\130\Tools\Binn\ManagementStudio\SqlWorkbenchProjectItems\Sql
Coxy

4

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


1

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

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

2
一个可靠的策略,但是,这并没有删除我的BOM标记,这就是git视为二进制的东西。相反,我用了答案使用PowerShell写在UTF-8文件没有BOM,它使用[System.IO.File]::WriteAllLines($MyPath, $MyFile, $Utf8NoBomEncoding)
KyleMit
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.