tipos tag remove practices etiquetas crear best git unicode gitattributes

remove - git tag best practices



Git desordenado mis archivos, mostrando caracteres chinos en algunos lugares (4)

Aquí hay un (mal) script de power-shell que reparará los archivos en este estado. Reemplazará la secuencia "0x0D 0x00 0x0D 0x0A" con "0x0D 0x00 0x0A" y sobrescribirá el archivo que se le dio.

Después, probablemente debería volver a guardar el archivo en algo como UTF-8.

function Fix-Encoding { Param( [String]$file ) $f = get-item $file; $bytes = [System.IO.File]::ReadAllBytes($f.fullname); $output = new-object "System.Collections.Generic.List[System.Byte]" $output.Capacity = $bytes.Length for ($i = 0; $i -lt $bytes.Length; $i++) { if ($i -lt $bytes.Length + 3) { if ($bytes[$i] -eq 0x0D -and $bytes[$i+1] -eq 0x00 -and $bytes[$i+2] -eq 0x0D -and $bytes[$i+3] -eq 0x0A) { $output.Add(0x0D); $output.Add(0x00); $output.Add(0x0A); $i += 3 } else { $output.Add($bytes[$i]); } } } [System.IO.File]::WriteAllBytes($f.fullname, $output) }

descargo de responsabilidad: Por Git, quiero decir ''yo'' en mal estado.

Earlier, quería que git-gui me mostrara la diff para la que cree que son archivos binarios.

Así que hice algunos cambios en mi ./.gitattributes

*.ini text *.inc text

Pero no funcionó. Luego hice algunos cambios en mis ./.git/info/attributes

*.ini text *.inc text *.inc crlf diff *.ini crlf diff

Y funcionó.

Pero ahora, cuando vuelvo a la anterior, se confunde ...

Así es como debe verse:

No sucede en todos los archivos. EDITAR: Ocurre solo en archivos que tienen caracteres especiales en ellos.

P: ¿Es el problema con los compromisos en sí o simplemente algún ajuste?
P: ¿Puedo recuperarme?


Para agregar a una buena explicación por @bobince. Una solución a este problema (excepto los archivos con caracteres especiales) es convertir todo a utf-8. Resolví esto ejecutando un script de python en notepad ++ en todos los archivos de un directorio (desde una computadora que no tenía los archivos desordenados).

Encontré el script original here

Una copia del script python de notepad ++:

import os; import sys; filePathSrc="C://Temp//UTF8" for root, dirs, files in os.walk(filePathSrc): for fn in files: if fn[-4:] != ''.jar'' and fn[-5:] != ''.ear'' and fn[-4:] != ''.gif'' and fn[-4:] != ''.jpg'' and fn[-5:] != ''.jpeg'' and fn[-4:] != ''.xls'' and fn[-4:] != ''.GIF'' and fn[-4:] != ''.JPG'' and fn[-5:] != ''.JPEG'' and fn[-4:] != ''.XLS'' and fn[-4:] != ''.PNG'' and fn[-4:] != ''.png'' and fn[-4:] != ''.cab'' and fn[-4:] != ''.CAB'' and fn[-4:] != ''.ico'': notepad.open(root + "//" + fn) console.write(root + "//" + fn + "/r/n") notepad.runMenuCommand("Encoding", "Convert to UTF-8 without BOM") notepad.save() notepad.close()


Sus archivos ini se guardan en UTF-16LE, la codificación que Windows describe erróneamente como ''Unicode''.

Las herramientas de diferencia por defecto de Git no funcionan en UTF-16, porque no es una codificación compatible con ASCII. Es por eso que git detectó los archivos como binarios originalmente.

La conversión de nueva línea LF / CRLF es ver cada byte de 0x0A como una nueva línea y reemplazarlo con 0x0D-0x0A. Pero, en un archivo UTF-16LE, una nueva línea en realidad está señalizada por 0x0A-0x00, y reemplazarla con 0x0D-0x0A-0x00 significa que tiene un número impar de bytes, por lo que la alineación de cada unidad de código de dos bytes En la siguiente línea está desincronizado. En consecuencia, cualquier otra línea queda destrozada.

Sus opciones son:

  1. Revertir el cambio de atributo y dejar que Git maneje los archivos como binarios (perdiendo el beneficio de diffs).

  2. Guarde los archivos en una codificación compatible con ASCII. Parece que tu contenido no tiene caracteres que no sean ASCII, así que, con suerte, ¿eso no es un problema? Normalmente, desearía guardar todos sus archivos como UTF-8; esto es compatible con ASCII, pero también permite el uso de todos los caracteres Unicode. Pero eso depende de si Rainmeter admite la lectura de archivos INI codificados así (probablemente no).

  3. Configure git para usar una herramienta de diferencias diferente , aunque esto hará que sea más complicado para otros trabajar con su repositorio.


Tuve un problema similar recientemente. Tenemos un archivo .gitattributes todo el .gitattributes en el nivel raíz, que incluye las líneas:

* text=auto *.sql text

Uno de nuestro equipo estaba escribiendo código SQL usando SQL Management Studio que, sin saberlo, estaba guardando los archivos como UTF-16. Pudo ingresar el código a Git sin problema, pero al hacer el check-out, el código se tradujo a los caracteres chinos tal como se describe en esta publicación.

Un hexdump de los archivos en cuestión confirmó que el problema era la traducción de 0x000A a 0x000A0D.

Para nosotros, la solución fue convertir los archivos a ASCII utilizando lo siguiente:

  1. Eliminar el archivo ofensivo del directorio de trabajo
  2. Cree un archivo temporal .gitattributes en el directorio local para forzar a git a retirar el archivo sin realizar una conversión de final de línea. Por ejemplo, incluir la línea *.sql binary

  3. Verifique el (los) archivo (s) de Git. Debería ver que los archivos no se han traducido y no tienen caracteres chinos.

  4. Convertir el archivo a ASCII. Usamos Notepad ++ para esto, pero también es posible usar iconv , que se instala como parte de Git para Windows. Creo que UTF-8 también sería una opción si el archivo contiene caracteres que no son ASCII, pero esto no fue necesario para nuestros propósitos.
  5. Registrar la versión ASCII del archivo.
  6. Eliminar el archivo local .gitattributes