Dlaczego git myśli, że mój plik .sql jest plikiem binarnym?

84

Mam kilka plików .sql, które po raz pierwszy umieściłem na githubie. Jednak kiedy patrzę na zatwierdzenie, mówi:

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

Czy ktoś może mi powiedzieć, dlaczego jest napisane „Plik binarny nie jest wyświetlany”

Alan2
źródło

Odpowiedzi:

98

Samo rozszerzenie nie wystarczy, aby GitHub mógł sprawdzić, czy jest to plik tekstowy.
Musi więc spojrzeć na jego zawartość.

Jak wspomniano w sekcjiDlaczego Git traktuje ten plik tekstowy jako plik binarny? ”, Jego zawartość może nie zawierać wystarczającej liczby znaków ascii, aby zgadnąć, że jest to plik tekstowy.

Możesz użyć pliku .gitattributes, aby jawnie określić, że a .sqlpowinno być tekstem, a nie plikiem binarnym.

*.sql diff

Aktualizacja 2018: jak wspomniałem w artykuleKodowanie Utf-8 nie działa na dokumencie zakodowanym w utf-8 ”, Git 2.18 .gitattributes ma nowy working-tree-encodingatrybut.
Tak, jak pokazano na Rusi „s odpowiedź :

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

Jak kostix dodaje w komentarzach :

jeśli te pliki są generowane przez Microsoft SQL Management Studio (lub jak to się nazywa w używanej wersji narzędzi do zarządzania MS SQL Server), zapisywane pliki są kodowane w UCS-2 (lub UTF-16) - a kodowanie dwubajtowe, które rzeczywiście nie jest tekstem w oczach Gita

Możesz zobaczyć przykład w „ Git mówi„ Binary files a… and b… differ”włączony dla *.regplików

Jak wspomniano w „ Ustaw plik jako niebinarny w git ”:

„Dlaczego Git oznacza mój plik jako binarny?” Odpowiedź jest taka, ponieważ widzi bajt NUL (0) gdzieś w obrębie pierwszych 8000 znaków pliku.
Zwykle dzieje się tak, ponieważ plik jest zapisywany jako coś innego niż UTF-8. Więc prawdopodobnie jest zapisywany jako UCS-2, UCS-4, UTF-16 lub UTF-32. Wszystkie z nich mają osadzone znaki NUL podczas używania znaków ASCII


Jak Neo wspomina w komentarzach (oraz w Dlaczego Git traktuje ten plik tekstowy jako plik binarny? ):

Możesz zmienić kodowanie zapisanego pliku w SSMS na UTF-8, wybierając kodowanie „UTF-8 z podpisem” z pozycji menu „Zaawansowane opcje zapisywania” w menu Plik.

VonC
źródło
18
@Alan, jeśli te pliki są generowane przez Microsoft SQL Management Studio (lub jak to się nazywa w używanej wersji narzędzi do zarządzania MS SQL Server), zapisywane pliki są kodowane w UCS-2 (lub UTF-16) - kodowanie dwubajtowe, które rzeczywiście nie jest tekstem w oczach Gita.
kostix
16
Możesz zmienić kodowanie zapisanego pliku w SSMS na UTF-8, wybierając kodowanie „UTF-8 z podpisem” z pozycji menu „Zaawansowane opcje zapisywania” w menu Plik. Źródło: stackoverflow.com/a/21170043/197591
Neo
2
@Neo Słuszna uwaga. W odpowiedzi zawarłem Twój komentarz, aby uzyskać lepszą widoczność.
VonC
7
Kolejną fajną sztuczką, jeśli używasz Git Bash w systemie Windows i nie chcesz nadpisywać żadnych zmian wprowadzonych w plikach, wystarczy wpisać „dos2unix * .sql”. Spowoduje to konwersję wszystkich plików UCS2 do UTF8, umożliwiając gitowi rozpoznanie tekstu.
Slothario,
1
@thebfactor sprawdź opcję ' iso' tego polecenia dos2unix, aby zobaczyć, czy to pomaga: computerhope.com/unix/dos2unix.htm
VonC
9

Korzystając z zaakceptowanej odpowiedzi z połączonego pytania i kilku innych komentarzy, wymyśliłem to jako rozwiązanie problemu, który działa i działa na 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)
}
Carl
źródło
1
Ciekawy. Widzę, że za pomocą Powershell. +1
VonC
Get-Content potrzebował flagi w moim przypadku, aby poradzić sobie z nawiasami kwadratowymi w nazwach plików (np. [Dbo]):$Contents = Get-Content -LiteralPath $MyPath
Jeremy Murray
7

To stare pytanie ma nową odpowiedź - working-tree-encodingwłaśnie z tych powodów git zyskał ostatnio opcję . Zobacz dokumentację gitattributes [Upewnij się, że strona podręcznika pasuje, ponieważ jest to całkiem nowe!]

Dowiedz się, jak kodować plik sql, np. Z file

Jeśli (powiedzmy) jego utf-16 bez bom na komputerze z systemem Windows, dodaj do swojego pliku gitattributes

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

Jeśli utf-16 little endinan (z bom) to zrobi

*.sql text working-tree-encoding=UTF-16 eol=CRLF
Rusi
źródło
1
Ciekawy. Głosowano za. Odwołałem się do Twojej odpowiedzi w mojej ( stackoverflow.com/a/28145968/6309 ). Udokumentowałem nowy atrybut w maju 2018 dla Git 2.18: stackoverflow.com/a/50435869/6309
VonC,
4

Dla tych, którzy borykają się z tym problemem w SSMS dla 2008 R2 (tak, nadal!), Możesz ustawić domyślne kodowanie w następujący sposób:

  • Zlokalizuj katalog C: \ Program Files (x86) \ Microsoft SQL Server \ 100 \ Tools \ Binn \ VSShell \ Common7 \ IDE \ SqlWorkbenchProjectItems \ Sql

Lokalizacje mogą się różnić. Jest to katalog używany podczas domyślnej instalacji w 64-bitowym systemie Windows 7.

  • W tej lokalizacji dodaj (lub edytuj) pusty plik SQL SQLFile.sql.

Służy jako szablon dla nowych plików SQL. Zapisz go, używając wymaganego kodowania (w moim przypadku Windows-1252 z zakończeniami linii Windows). Strzałka po prawej stronie przycisku „Zapisz” umożliwia wybór kodowania.

Musisz skoordynować kodowanie ze swoim zespołem programistów, aby uniknąć kłopotów z git i SSMS.

Ratunek
źródło
2
Znalazłem ten plik dla programu SSMS 2012 pod adresemC:\Program Files (x86)\Microsoft SQL Server\110\Tools\Binn\ManagementStudio\SqlWorkbenchProjectItems\Sql
Aaron D
1
I SSMS2016:C:\Program Files (x86)\Microsoft SQL Server\130\Tools\Binn\ManagementStudio\SqlWorkbenchProjectItems\Sql
Coxy
4

Oto szybkie obejście, które zadziałało w moim przypadku przy użyciu SSMS 2012. W obszarze tools => options => environment => international settings, jeśli zmienisz język z „English” na „Same as Microsoft Windows” (może pojawić się monit o ponowne uruchomienie SSMS, aby zmiany odniosły skutek), nie będzie już używać UTF-16 jako domyślnego kodowania dla nowych plików - wszystkie nowe pliki, które utworzę, mają teraz Codepage 1252 (plik => zaawansowane opcje zapisu), co jest 8-bitowym schematem kodowania i wydaje się, że nie ma z nim problemówGit Diff

iliketocode
źródło
1

Sposobem rozwiązania tego problemu jest wymuszenie na pliku używania kodowania 8-bitowego. Możesz uruchomić ten skrypt PowerShell, aby zmienić kodowanie wszystkich plików SQL w bieżącym katalogu i jego podkatalogach.

Get-ChildItem -Recurse *.sql | foreach {
  $FileName = $_.FullName;
  [System.Io.File]::ReadAllText($FileName) | Out-File -FilePath $FileName -Encoding UTF8;
}
Gyromite
źródło
2
Solidna strategia nie usunęła jednak dla mnie znacznika BOM, który git traktuje jako binarny. Zamiast tego użyłem odpowiedzi na temat używania PowerShell do napisania pliku w UTF-8 bez BOM, który używa[System.IO.File]::WriteAllLines($MyPath, $MyFile, $Utf8NoBomEncoding)
KyleMit