我有一些.sql文件,这是我第一次将它们推送到Github上。但是当我查看提交记录时,它显示:
BIN WebRole/Sql/Database.sql View
Binary file not shown
有人能告诉我为什么它显示“未显示二进制文件”吗?
仅仅通过扩展名不能让GitHub识别它是否是文本文件。
因此,必须查看它的内容。
正如在“为什么Git将这个文本文件视为二进制文件?”中提到的那样,它的内容可能不包含足够的ASCII字符来猜测它是文本文件。
您可以使用.gitattributes文件明确指定一个.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管理工具(或您正在使用的某个版本的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”来更改保存文件的编码为UTF-8。
iso
”,看看是否有帮助:https://www.computerhope.com/unix/dos2unix.htm - VonCworking-tree-encoding
的选项,专门用于这些情况。请参阅gitattributes文档。file
命令。 如果(假设)它在Windows机器上是utf-16无BOM,则将其添加到您的gitattributes文件中。*.sql text working-tree-encoding=UTF-16LE eol=CRLF
如果是UTF-16小端序(带BOM),则进行处理。
*.sql text working-tree-encoding=UTF-16 eol=CRLF
file
命令,或者与file
命令相同的逻辑来猜测编码,当你指定text
时。我推测Git开发人员不想开始猜测编码的兔子洞。除非在gitattributes中指定text
时,Git确实使用类似于file
的逻辑。如果你指定了working-tree-encoding=UTF-16LE
且你的一些SQL文件是Windows-1252编码,我认为你可能会遇到问题,因为Git会尝试将其转换为内部使用的UTF-8编码。 - Jason Sworking-tree-encoding=UTF-16
,但其中一个开发人员将文件保存为Windows-1252甚至ASCII编码。Git会认为这个文件是UTF-16编码,试图将其转换为UTF-8(用于内部使用),并且可能会根据Windows-1252或ASCII编码文件的内容而失败。我还没有测试过这一点。 - Jason S.gitattributes
!对于text
来说就是另一回事:在Windows上可以且必须使用CRLF,在*nix上则使用LF。这是唯一使不同操作系统上的文件统一在git中的情况。 - Rusi使用链接问题中被接受的答案以及其他一些评论,我想出了这个解决办法,它可以在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
- Jeremy MurrayGit Diff
相关的问题。如果你在SSMS 2008 R2中遇到了这个问题(是的,仍然存在!),你可以按照以下步骤设置默认编码:
不同的位置可能有所不同。这是Windows 7 64位上默认安装使用的目录。
这将作为新的.SQL文件的模板。使用你需要的编码保存它(在我的情况下,使用Windows-1252编码和Windows换行符)。'保存'按钮右侧的箭头给出了编码选择。
你需要与开发团队协调编码,以避免git和SSMS带来的麻烦。
C:\Program Files (x86)\Microsoft SQL Server\110\Tools\Binn\ManagementStudio\SqlWorkbenchProjectItems\Sql
找到了适用于SSMS 2012的文件。 - Aaron DC:\Program Files (x86)\Microsoft SQL Server\130\Tools\Binn\ManagementStudio\SqlWorkbenchProjectItems\Sql
- CoxyGet-ChildItem -Recurse *.sql | foreach {
$FileName = $_.FullName;
[System.Io.File]::ReadAllText($FileName) | Out-File -FilePath $FileName -Encoding UTF8;
}
[System.IO.File] :: WriteAllLines($MyPath, $MyFile, $Utf8NoBomEncoding)
。 - KyleMit