Cómo evitar que git rompa la encoding en el process de pago

Recientemente agregué un file .gitattributes al repository de CA # con la siguiente configuration:

* text=auto *.cs text diff=csharp 

Renormalicé el repository siguiendo estas instrucciones de github y parecía funcionar bien.

El problema que tengo es que cuando pago algunos files (no todos) veo muchos caracteres extraños mezclados con el código real. Parece suceder cuando git ejecuta los files a través de la conversión lf->crlf especificada por el file .gitattributes anterior.

Según Notepad ++, los files que se descomponen utilizan la encoding UCS-2 Little Endian o UCS-2 Big Endian . Los files que parecen funcionar bien tienen UTF-8 ANSI o UTF-8 .

Como reference, mi versión de git es 1.8.0.msysgit.0 y mi sistema operativo es Windows 8.

¿Alguna idea de cómo puedo solucionar esto? ¿Sería suficiente cambiar la encoding de los files?

Esto sucede si usa una encoding donde cada carácter tiene dos bytes.
CRLF se codificaría entonces como \0\r\0\n .

Git piensa que es una encoding de un solo byte, por lo que se convierte en \0\r\0\r\n .
Esto hace que la siguiente línea esté un byte desactivada, lo que hace que cada otra línea esté llena de chino. (porque el \0 convierte en el byte de order inferior en lugar del byte de order superior)

Puede convertir files a UTF8 usando este script LINQPad:

 const string path = @"C:\..."; foreach (var file in Directory.EnumerateFiles(path, "*", SearchOption.AllDirectories)) { if (!new [] { ".html", ".js"}.Contains(Path.GetExtension(file))) continue; File.WriteAllText(file, String.Join("\r\n", File.ReadAllLines(file)), new UTF8Encoding(encoderShouldEmitUTF8Identifier: true)); file.Dump(); } 

Esto no arreglará los files rotos; puede arreglar los files reemplazando \r\n con \n en un editor hexadecimal. No tengo un script LINQPad para eso. (ya que no hay un método simple Replace() para byte[] s)

Para solucionar esto, convierta la encoding de los files (UTF-8 debería estar bien) o deshabilite la conversión automática de salto de línea ( git config core.autocrlf false y .gitattributes cosas que tiene).