Чому git вважає, що мій файл .sql є бінарним файлом?


84

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

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

Хтось може сказати мені, чому в ньому сказано: "Двійковий файл не відображається"


Відповіді:


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


Як згадує Neo у коментарях (а також у розділі Чому Git трактує цей текстовий файл як двійковий файл? ):

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


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
Нео,

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 без bom на Windows-машині, додайте у файл gitattributes

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

Якщо utf-16 маленький ендінан (з бомом), зробіть це

*.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
Коксі

4

Ось короткий обхідний спосіб, який у мене спрацював, використовуючи SSMS 2012. Під інструментами => options => environment => міжнародні налаштування, якщо ви зміните мову з «англійської» на «Те саме, що і 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
Однак надійна стратегія не видалила для мене маркер специфікації, що git розглядає як бінарний файл. Натомість я використав відповідь на Використання PowerShell для написання файлу в UTF-8 без специфікації, яка використовує[System.IO.File]::WriteAllLines($MyPath, $MyFile, $Utf8NoBomEncoding)
KyleMit
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.