¿Por qué git piensa que mi archivo .sql es un archivo binario?

84

Tengo algunos archivos .sql que envié por primera vez a github. Sin embargo, cuando miro el compromiso, dice:

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

¿Alguien puede decirme por qué dice "No se muestra el archivo binario"?

Alan2
fuente
posible duplicado de ¿Por qué git cree que mi archivo cs es binario?
Nick Grealy

Respuestas:

98

La extensión por sí sola no es suficiente para que GitHub vea si es un archivo de texto.
Entonces tiene que mirar su contenido.

Y como se menciona en " ¿Por qué Git trata este archivo de texto como un archivo binario? ", Su contenido puede no incluir suficientes caracteres ascii para adivinar que es un archivo de texto.

Puede usar un archivo .gitattributes para especificar explícitamente que .sqldebe ser un texto, no un binario.

*.sql diff

Actualización 2018: como menciono en " La codificación Utf-8 no funciona en un documento codificado en utf-8 ", Git 2.18 .gitattributes tiene un nuevo working-tree-encodingatributo.
Entonces, como se muestra en la respuesta de Rusi :

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

Como agrega kostix en los comentarios :

si estos archivos son generados por Microsoft SQL Management Studio (o como se llame en la versión de las herramientas de administración de MS SQL Server que está usando), los archivos que guarda están codificados en UCS-2 (o UTF-16) - un codificación de dos bytes, que de hecho no es texto a los ojos de Git

Puedes ver un ejemplo en " Git dice" Binary files a… and b… differ"activado para *.regarchivos "

Como se menciona en " Establecer archivo como no binario en git ":

"¿Por qué Git marca mi archivo como binario?" La respuesta es porque está viendo un byte NUL (0) en algún lugar dentro de los primeros 8000 caracteres del archivo.
Normalmente, eso sucede porque el archivo se guarda como algo diferente a UTF-8. Por lo tanto, es probable que se guarde como UCS-2, UCS-4, UTF-16 o UTF-32. Todos ellos tienen caracteres NUL incrustados cuando se utilizan caracteres ASCII


Como Neo menciona en los comentarios (y en ¿Por qué Git trata este archivo de texto como un archivo binario? ):

Puede cambiar la codificación de un archivo guardado en SSMS a UTF-8 seleccionando la codificación 'UTF-8 con firma' en el elemento de menú 'Opciones avanzadas de guardado' en el menú Archivo.

VonC
fuente
18
@Alan, si estos archivos son generados por Microsoft SQL Management Studio (o como se llame en la versión de las herramientas de administración de MS SQL Server que está usando), los archivos que guarda están codificados en UCS-2 (o UTF-16) - una codificación de dos bytes, que de hecho no es texto a los ojos de Git.
kostix
16
Puede cambiar la codificación de un archivo guardado en SSMS a UTF-8 seleccionando la codificación 'UTF-8 con firma' en el elemento de menú 'Opciones avanzadas de guardado' en el menú Archivo. Fuente: stackoverflow.com/a/21170043/197591
Neo
2
@Neo Buen punto. He incluido su comentario en la respuesta para mayor visibilidad.
VonC
7
Otro buen truco, si está ejecutando Git Bash en Windows y no desea sobrescribir ningún cambio que haya realizado en los archivos, es simplemente escribir "dos2unix * .sql". Eso convertirá todos los archivos UCS2 a UTF8, lo que permitirá que git reconozca el texto.
Slothario
1
@thebfactor marque la opción ' iso' de ese comando dos2unix para ver si eso ayuda: computerhope.com/unix/dos2unix.htm
VonC
9

Usando la respuesta aceptada de la pregunta vinculada y algunos otros comentarios, se me ocurrió esto como una solución al problema, que funciona y se ejecuta en 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
fuente
1
Interesante. Usando Powershell, ya veo. +1
VonC
Get-Content necesitaba una bandera en mi caso para lidiar con los corchetes en los nombres de los archivos (como [dbo]):$Contents = Get-Content -LiteralPath $MyPath
Jeremy Murray
7

Esta vieja pregunta tiene una nueva respuesta: git recientemente desarrolló una opción working-tree-encodingprecisamente por estas razones. Consulte los documentos de gitattributes [¡Asegúrese de que su página de manual coincida, ya que esto es bastante nuevo!]

Descubra la codificación del archivo sql, por ejemplo, con file

Si (digamos) su utf-16 sin bom en la máquina de Windows, agregue a su archivo gitattributes

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

Si utf-16 little endinan (con bom) hazlo

*.sql text working-tree-encoding=UTF-16 eol=CRLF
Rusi
fuente
1
Interesante. Voto a favor. He hecho referencia a su respuesta en la mía ( stackoverflow.com/a/28145968/6309 ). Había documentado el nuevo atributo en mayo de 2018 para Git 2.18: stackoverflow.com/a/50435869/6309
VonC
4

Para aquellos que luchan con este problema en SSMS para 2008 R2 (¡sí, aún así!), Puede configurar la codificación predeterminada de la siguiente manera:

  • Busque el directorio C: \ Archivos de programa (x86) \ Microsoft SQL Server \ 100 \ Tools \ Binn \ VSShell \ Common7 \ IDE \ SqlWorkbenchProjectItems \ Sql

Las ubicaciones pueden variar. Este es el directorio utilizado por la instalación predeterminada en Windows 7 de 64 bits.

  • En esta ubicación, agregue (o edite) el archivo SQL vacío SQLFile.sql.

Esto se utiliza como plantilla para nuevos archivos .SQL. Guárdelo usando la codificación que necesita (en mi caso, Windows-1252 con finales de línea de Windows). La flecha a la derecha del botón "Guardar" le ofrece una selección de codificaciones.

Necesita coordinar las codificaciones con su equipo de desarrollo para evitar problemas con git y SSMS.

Recurso
fuente
2
Encontré este archivo para SSMS 2012 enC:\Program Files (x86)\Microsoft SQL Server\110\Tools\Binn\ManagementStudio\SqlWorkbenchProjectItems\Sql
Aaron D
1
Y SSMS2016:C:\Program Files (x86)\Microsoft SQL Server\130\Tools\Binn\ManagementStudio\SqlWorkbenchProjectItems\Sql
Coxy
4

Aquí hay una solución rápida que funcionó para mí, usando SSMS 2012. En herramientas => opciones => entorno => configuración internacional, si cambia el idioma de "Inglés" a "Igual que Microsoft Windows" (es posible que le pida que reinicie SSMS para que los cambios surtan efecto), ya no usará UTF-16 como la codificación predeterminada para archivos nuevos; todos los archivos nuevos que creo tienen la página de códigos 1252 (archivo => opciones avanzadas de guardado) ahora, que es un esquema de codificación de 8 bits y parece no tener problemas conGit Diff

iliketocode
fuente
1

La forma de resolver este problema es forzar al archivo a utilizar la codificación de 8 bits. Puede ejecutar este script de PowerShell para cambiar la codificación de todos los archivos .SQL en el directorio actual y sus subdirectorios.

Get-ChildItem -Recurse *.sql | foreach {
  $FileName = $_.FullName;
  [System.Io.File]::ReadAllText($FileName) | Out-File -FilePath $FileName -Encoding UTF8;
}
Giromita
fuente
2
Sin embargo, una estrategia sólida, esto no eliminó el marcador BOM para mí, que es lo que git trata como binario. En cambio, usé la respuesta a Usar PowerShell para escribir un archivo en UTF-8 sin la lista de materiales que usa[System.IO.File]::WriteAllLines($MyPath, $MyFile, $Utf8NoBomEncoding)
KyleMit