Почему git думает, что мой файл .sql является двоичным файлом?

84

У меня есть несколько файлов .sql, которые я только что впервые отправил на github. Однако, когда я смотрю на коммит, он говорит:

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

Может кто-нибудь сказать мне, почему он говорит: "Двоичный файл не показан"

Алан2
источник
возможный дубликат Почему git думает, что мой файл cs двоичный?
Ник Грили

Ответы:

98

Одного расширения GitHub недостаточно, чтобы определить, является ли это текстовым файлом.
Поэтому он должен смотреть на свое содержание.

И как упоминалось в разделе « Почему Git рассматривает этот текстовый файл как двоичный файл? », Его содержимое может не включать достаточное количество символов ascii, чтобы предположить, что это текстовый файл.

Вы можете использовать файл .gitattributes, чтобы явно указать, что это .sqlдолжен быть текст, а не двоичный файл.

*.sql diff

Обновление 2018: как я упоминал в статье « Кодировка Utf-8 не работает с документом в кодировке utf-8 », Git 2.18 .gitattributes имеет новый working-tree-encodingатрибут.
Таким образом, как показано на руси «S ответ :

*.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 отмечает мой файл как двоичный?» Ответ заключается в том, что он видит байт NUL (0) где-то в пределах первых 8000 символов файла.
Обычно это происходит из-за того, что файл сохраняется не в формате UTF-8. Таким образом, он, вероятно, сохраняется как UCS-2, UCS-4, UTF-16 или UTF-32. Все они имеют встроенные символы NUL при использовании символов ASCII.


Как упоминает Нео в комментариях (и в Почему Git рассматривает этот текстовый файл как двоичный файл? ):

Вы можете изменить кодировку сохраненного файла в SSMS на UTF-8, выбрав кодировку «UTF-8 с подписью» в пункте меню «Дополнительные параметры сохранения» в меню «Файл».

VonC
источник
18
@Alan, если эти файлы генерируются Microsoft SQL Management Studio (или как там это называется в версии инструментов управления MS SQL Server, которые вы используете), файлы, которые он сохраняет, кодируются в UCS-2 (или UTF-16) - двухбайтовая кодировка, которая действительно не является текстом в глазах Git.
kostix
16
Вы можете изменить кодировку сохраненного файла в SSMS на UTF-8, выбрав кодировку «UTF-8 с подписью» в пункте меню «Дополнительные параметры сохранения» в меню «Файл». Источник: stackoverflow.com/a/21170043/197591
Neo,
2
@Neo Хороший вопрос. Я включил ваш комментарий в ответ для большей наглядности.
VonC
7
Еще один изящный трюк, если вы запускаете Git Bash в Windows и не хотите перезаписывать какие-либо изменения, внесенные вами в файлы, просто введите «dos2unix * .sql». Это преобразует все файлы UCS2 в UTF8, позволяя git распознавать текст.
Slothario
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
Джереми Мюррей
7

На этот старый вопрос есть новый ответ - git недавно стал опцией working-tree-encodingименно по этим причинам. См. Gitattributes Документацию [Убедитесь, что ваша страница совпадает, поскольку это совсем недавно!]

Узнайте кодировку файла sql, например, с помощью file

Если (скажем) его utf-16 без бомбы на машине с Windows, добавьте в свой файл 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 года для Git 2.18: stackoverflow.com/a/50435869/6309
VonC
4

Для тех, кто борется с этой проблемой в SSMS для 2008 R2 (да, все же!), Вы можете установить кодировку по умолчанию следующим образом:

  • Найдите каталог C: \ Program Files (x86) \ Microsoft SQL Server \ 100 \ Tools \ Binn \ VSShell \ Common7 \ IDE \ SqlWorkbenchProjectItems \ Sql

Расположение может отличаться. Это каталог, используемый при установке по умолчанию в 64-разрядной версии Windows 7.

  • В этом месте добавьте (или отредактируйте) пустой файл SQL SQLFile.sql.

Он используется в качестве шаблона для новых файлов .SQL. Сохраните его, используя нужную вам кодировку (в моем случае Windows-1252 с окончанием строки Windows). Стрелка справа от кнопки «Сохранить» позволяет выбрать кодировку.

Вам необходимо согласовать кодировки с вашей командой разработчиков, чтобы избежать проблем с git и SSMS.

Ресурс
источник
2
Я нашел этот файл для SSMS 2012 в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. В разделе tools => options => environment => international settings, если вы измените язык с «English» на «Same as Microsoft Windows» (может потребоваться перезагрузка SSMS, чтобы изменения вступили в силу), он больше не будет использовать UTF-16 в качестве кодировки по умолчанию для новых файлов - все новые файлы, которые я создаю, теперь имеют кодовую страницу 1252 (файл => расширенные параметры сохранения), что является 8-битной схемой кодирования и вроде бы нет проблем сGit Diff

iliketocode
источник
1

Способ решить эту проблему - заставить файл использовать 8-битную кодировку. Вы можете запустить этот сценарий PowerShell, чтобы изменить кодировку всех файлов .SQL в текущем каталоге и его подкаталогах.

Get-ChildItem -Recurse *.sql | foreach {
  $FileName = $_.FullName;
  [System.Io.File]::ReadAllText($FileName) | Out-File -FilePath $FileName -Encoding UTF8;
}
Гиромит
источник
2
Тем не менее, надежная стратегия, это не удалило для меня маркер спецификации, который git рассматривает как двоичный. Вместо этого я использовал ответ с помощью PowerShell , чтобы написать файл в UTF-8 без BOM , который использует[System.IO.File]::WriteAllLines($MyPath, $MyFile, $Utf8NoBomEncoding)
KyleMit