Warum glaubt git, dass meine .sql-Datei eine Binärdatei ist?

80

Ich habe einige .sql-Dateien, die ich gerade zum ersten Mal auf github gepusht habe. Wenn ich mir jedoch das Commit anschaue, heißt es:

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

Kann mir jemand sagen, warum es heißt "Binärdatei nicht angezeigt"

Alan2
quelle
Mögliches Duplikat von Warum glaubt Git, dass meine CS-Datei binär ist?
Nick Grealy

Antworten:

95

Die Erweiterung allein reicht GitHub nicht aus, um festzustellen, ob es sich um eine Textdatei handelt.
Also muss es sich seinen Inhalt ansehen.

Und wie unter " Warum behandelt Git diese Textdatei als Binärdatei? " Erwähnt , enthält der Inhalt möglicherweise nicht genügend ASCII-Zeichen, um zu vermuten, dass es sich um eine Textdatei handelt.

Sie können eine .gitattributes-Datei verwenden, um explizit anzugeben, dass a .sqlein Text und keine Binärdatei sein soll.

*.sql diff

Update 2018: Wie ich in " Utf-8-Codierung funktioniert nicht mit utf-8-codiertem Dokument " erwähne, hat Git 2.18 .gitattributes ein neues working-tree-encodingAttribut.
So, wie in gezeigt Rusi ‚s Antwort :

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

Wie kostix in den Kommentaren hinzufügt :

Wenn diese Dateien vom Microsoft SQL Management Studio generiert werden (oder wie auch immer es in der Version der von Ihnen verwendeten MS SQL Server-Verwaltungstools heißt), werden die gespeicherten Dateien in UCS-2 (oder UTF-16) codiert - a Zwei-Byte-Codierung, die in den Augen von Git in der Tat kein Text ist

Sie können ein Beispiel in " Git sagt" Binary files a… and b… differfür *.regDateien "sehen.

Wie in " Datei als nicht binär in git festlegen " erwähnt:

"Warum markiert Git meine Datei als binär?" Die Antwort ist, dass irgendwo innerhalb der ersten 8000 Zeichen der Datei ein NUL (0) -Byte angezeigt wird.
Dies geschieht normalerweise, weil die Datei als etwas anderes als UTF-8 gespeichert wird. Es wird also wahrscheinlich als UCS-2, UCS-4, UTF-16 oder UTF-32 gespeichert. Alle diese haben NUL-Zeichen eingebettet, wenn ASCII-Zeichen verwendet werden


Wie Neo erwähnt in den Kommentaren (und warum diese Textdatei als Binärdatei ist Git behandeln? ):

Sie können die Codierung einer in SSMS gespeicherten Datei in UTF-8 ändern, indem Sie im Menüpunkt "Datei" im Menü "Erweiterte Speicheroptionen" die Option "UTF-8 mit Signatur" auswählen.

VonC
quelle
17
@Alan: Wenn diese Dateien vom Microsoft SQL Management Studio generiert werden (oder wie auch immer es in der Version der von Ihnen verwendeten MS SQL Server-Verwaltungstools heißt), werden die gespeicherten Dateien in UCS-2 (oder UTF-16) codiert. - eine Zwei-Byte-Codierung, die in den Augen von Git in der Tat kein Text ist.
Kostix
15
Sie können die Codierung einer in SSMS gespeicherten Datei in UTF-8 ändern, indem Sie im Menüpunkt "Datei" im Menü "Erweiterte Speicheroptionen" die Option "UTF-8 mit Signatur" auswählen. Quelle: stackoverflow.com/a/21170043/197591
Neo
2
@Neo Guter Punkt. Ich habe Ihren Kommentar zur besseren Sichtbarkeit in die Antwort aufgenommen.
VonC
7
Ein weiterer guter Trick, wenn Sie Git Bash unter Windows ausführen und keine Änderungen überschreiben möchten, die Sie an den Dateien vorgenommen haben, ist die Eingabe von "dos2unix * .sql". Dadurch werden alle UCS2-Dateien in UTF8 konvertiert, sodass Git den Text erkennt.
Slothario
1
@thebfactor Aktivieren Sie die Option ' iso' dieses Befehls dos2unix, um festzustellen, ob dies
hilfreich ist
8

Unter Verwendung der akzeptierten Antwort aus der verknüpften Frage und einiger anderer Kommentare habe ich dies als Lösung für das Problem gefunden, das funktioniert und unter Win10 ausgeführt wird

$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
quelle
1
Interessant. Ich verstehe, wenn ich Powershell benutze. +1
VonC
Get-Content brauchte in meinem Fall eine Flagge, um mit eckigen Klammern in Dateinamen (wie [dbo]) umzugehen:$Contents = Get-Content -LiteralPath $MyPath
Jeremy Murray
7

Diese alte Frage hat eine neue Antwort - working-tree-encodinggenau aus diesen Gründen hat git kürzlich eine Option entwickelt . Siehe gitattributes docs [ Stellen Sie sicher, dass Ihre Manpage übereinstimmt, da dies ziemlich neu ist!]

Finden Sie die Kodierung der SQL-Datei heraus, zB mit file

Wenn (sagen wir) sein utf-16 ohne bom auf Windows-Maschine, dann fügen Sie zu Ihrer gitattributes-Datei hinzu

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

Wenn utf-16 Little Endinan (mit Bom) es schaffen

*.sql text working-tree-encoding=UTF-16 eol=CRLF
Rusi
quelle
1
Interessant. Upvoted. Ich habe auf meine Antwort in meiner verwiesen ( stackoverflow.com/a/28145968/6309 ). Ich hatte das neue Attribut im Mai 2018 für Git 2.18 dokumentiert
VonC
4

Für diejenigen, die mit diesem Problem in SSMS für 2008 R2 zu kämpfen haben (ja, immer noch!), Können Sie die Standardcodierung wie folgt festlegen:

  • Suchen Sie das Verzeichnis C: \ Programme (x86) \ Microsoft SQL Server \ 100 \ Tools \ Binn \ VSShell \ Common7 \ IDE \ SqlWorkbenchProjectItems \ Sql

Die Standorte können variieren. Dies ist das Verzeichnis, das von der Standardinstallation unter Windows 7 64-Bit verwendet wird.

  • Fügen Sie an dieser Stelle die leere SQL-Datei SQLFile.sql hinzu (oder bearbeiten Sie sie).

Dies wird als Vorlage für neue .SQL-Dateien verwendet. Speichern Sie es mit der von Ihnen gewünschten Codierung (in meinem Fall Windows-1252 mit Windows-Zeilenenden). Der Pfeil rechts neben der Schaltfläche "Speichern" bietet Ihnen eine Auswahl an Codierungen.

Sie müssen die Codierungen mit Ihrem Entwicklungsteam koordinieren, um Git- und SSMS-Probleme zu vermeiden.

Ressource
quelle
2
Ich fand diese Datei für SSMS 2012 umC:\Program Files (x86)\Microsoft SQL Server\110\Tools\Binn\ManagementStudio\SqlWorkbenchProjectItems\Sql
Aaron D
1
Und SSMS2016:C:\Program Files (x86)\Microsoft SQL Server\130\Tools\Binn\ManagementStudio\SqlWorkbenchProjectItems\Sql
Coxy
4

Hier ist eine kurze Problemumgehung, die bei mir mit SSMS 2012 funktioniert hat. Wenn Sie unter tools => options => environment => international settings die Sprache von "English" in "Same as Microsoft Windows" ändern (werden Sie möglicherweise zum Neustart aufgefordert) SSMS, damit die Änderungen wirksam werden), verwendet UTF-16 nicht mehr als Standardcodierung für neue Dateien. Alle neuen Dateien, die ich erstelle, haben jetzt Codepage 1252 (Datei => Erweiterte Speicheroptionen), ein 8-Bit-Codierungsschema und scheint keine Probleme mit zu habenGit Diff

iliketocode
quelle
1

Die Lösung dieses Problems besteht darin, die Datei zur Verwendung der 8-Bit-Codierung zu zwingen. Sie können dieses PowerShell-Skript ausführen, um die Codierung aller SQL-Dateien im aktuellen Verzeichnis und seinen Unterverzeichnissen zu ändern.

Get-ChildItem -Recurse *.sql | foreach {
  $FileName = $_.FullName;
  [System.Io.File]::ReadAllText($FileName) | Out-File -FilePath $FileName -Encoding UTF8;
}
Gyromit
quelle
2
Eine solide Strategie, bei der der Stücklistenmarker für mich jedoch nicht entfernt wurde, was Git als binär behandelt. Stattdessen habe ich die Antwort auf Verwenden von PowerShell verwendet, um eine Datei in UTF-8 ohne die Stückliste zu schreiben, die verwendet[System.IO.File]::WriteAllLines($MyPath, $MyFile, $Utf8NoBomEncoding)
KyleMit