Pourquoi git pense-t-il que mon fichier .sql est un fichier binary?

J’ai quelques fichiers .sql que je viens juste de pousser pour la première fois. Cependant, quand je regarde le commit, il dit:

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

Quelqu’un peut-il me dire pourquoi il dit “fichier binary non montré”

L’extension seule ne suffit pas à Github pour voir s’il s’agit d’un fichier texte.
Il faut donc regarder son contenu.

Et comme mentionné dans ” Pourquoi Git traite-t-il ce fichier texte comme un fichier binary? “, Son contenu peut ne pas comprendre suffisamment de caractères ascii pour deviner qu’il s’agit d’un fichier texte.

Vous pouvez utiliser un fichier .gitatsortingbutes pour spécifier explicitement qu’un fichier .sql doit être un texte et non un binary.

 *.sql diff 

Comme Kostix ajoute dans les commentaires :

Si ces fichiers sont générés par Microsoft SQL Management Studio (ou tout ce qu’ils appellent dans la version des outils de gestion de MS SQL Server que vous utilisez), les fichiers qu’il enregistre sont encodés dans UCS-2 (ou UTF-16). encodage à deux octets, qui n’est en effet pas du texte dans les yeux de Git

Vous pouvez voir un exemple dans ” Git dit” Binary files a… and b… differ “pour les fichiers *.reg

Comme mentionné dans ” Définir le fichier comme non binary dans git “:

“Pourquoi Git marque mon fichier comme binary?” La réponse est parce qu’il voit un octet NUL (0) quelque part dans les 8 000 premiers caractères du fichier.
En règle générale, cela se produit car le fichier est enregistré sous un autre nom que UTF-8. Ainsi, il est probable qu’il soit enregistré sous UCS-2, UCS-4, UTF-16 ou UTF-32. Tous ceux qui ont des caractères NUL incorporés lors de l’utilisation de caractères ASCII


Comme Neo le mentionne dans les commentaires (et dans Pourquoi Git traite-t-il ce fichier texte comme un fichier binary? ):

Vous pouvez modifier l’encodage d’un fichier enregistré dans SSMS en UTF-8 en sélectionnant le codage ‘UTF-8 avec signature’ dans l’élément de menu ‘Options de sauvegarde avancées’ du menu Fichier.

Pour ceux qui ont des problèmes avec SSMS pour 2008 R2 (oui, encore!), Vous pouvez définir l’encodage par défaut comme suit:

  • Recherchez le répertoire C: \ Program Files (x86) \ Microsoft SQL Server \ 100 \ Outils \ Binn \ VSShell \ Common7 \ IDE \ SqlWorkbenchProjectItems \ Sql

Les emplacements peuvent varier. C’est le répertoire utilisé par l’installation par défaut sur Windows 7 64 bits.

  • Dans cet emplacement, ajoutez (ou éditez) le fichier SQL vide SQLFile.sql.

Ceci est utilisé comme modèle pour les nouveaux fichiers .SQL. Enregistrez-le en utilisant l’encodage dont vous avez besoin (dans mon cas, Windows-1252 avec des fins de ligne Windows). La flèche à droite du bouton “Enregistrer” vous permet de choisir les encodages.

Vous devez coordonner les encodages avec votre équipe de développement pour éviter les tracas git et SSMS.

Voici une solution rapide qui a fonctionné pour moi, en utilisant SSMS 2012. Sous tools => options => environment => parameters internationaux, si vous changez la langue de “English” à “Identique à Microsoft Windows” (cela peut vous demander de redémarrer SSMS pour que les modifications prennent effet), il n’utilisera plus UTF-16 comme encodage par défaut pour les nouveaux fichiers – tous les nouveaux fichiers que je crée ont maintenant Codepage 1252 (fichier => options de sauvegarde avancées) et semble avoir aucun problème avec Git Diff

En utilisant la réponse acceptée de la question liée et quelques autres commentaires, j’ai proposé ceci comme solution au problème, qui fonctionne et fonctionne sous 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) } 

La façon de résoudre ce problème consiste à forcer le fichier à utiliser le codage 8 bits. Vous pouvez exécuter ce script PowerShell pour modifier l’encodage de tous les fichiers .SQL du répertoire en cours et de ses sous-répertoires.

 Get-ChildItem -Recurse *.sql | foreach { $FileName = $_.FullName; [System.Io.File]::ReadAllText($FileName) | Out-File -FilePath $FileName -Encoding UTF8; }