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


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.


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)
}

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

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.


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


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;
}

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.