Как остановить git от нарушения кодировки при оформлении заказа

Недавно я добавил файл .gitattributes в репозиторий C # со следующими настройками:

*            text=auto
*.cs         text diff=csharp

Я перенормировал репозиторий , следуя этим инструкциям из github, и, похоже, он работал нормально .

Проблема, с которой я сталкиваюсь, заключается в том, что когда я проверяю некоторые файлы (не все из них), я вижу много странных символов, смешанных с фактическим кодом. Похоже, это происходит, когда git запускает файлы через преобразование lf->crlf, указанное выше в файле .gitattributes.

Согласно Notepad ++, испорченные файлы используют кодировку UCS-2 Little Endian или UCS-2 Big Endian. Файлы, которые кажутся работоспособными, имеют кодировку ANSI или UTF-8.

Для справки моя версия git - 1.8.0.msysgit.0, а моя ОС - Windows 8.

Есть идеи, как я могу это исправить? Достаточно ли изменить кодировку файлов?


person Evan    schedule 04.12.2012    source источник


Ответы (2)


Это произойдет, если вы используете кодировку, в которой каждый символ состоит из двух байтов.
CRLF тогда будет закодирован как \0\r\0\n.

Git считает, что это однобайтовая кодировка, поэтому он превращает ее в \0\r\0\r\n.
Это делает следующую строку на один байт отключенной, в результате чего все остальные строки заполняются китайским языком. (потому что \0 становится младшим байтом, а не старшим)

Вы можете конвертировать файлы в UTF8, используя этот скрипт 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();
}

Это не исправит битые файлы; вы можете исправить файлы, заменив \r\n на \n в шестнадцатеричном редакторе. У меня нет сценария LINQPad для этого. (поскольку для byte[]s нет простого Replace() метода)

person SLaks    schedule 04.12.2012
comment
Я использовал ваши предложения, но запустил скрипт PowerShell отсюда: stackoverflow.com/questions/1681568/ Кажется, проблемы устранили. - person Evan; 04.12.2012

Чтобы исправить это, либо преобразуйте кодировку файлов (UTF-8 должно быть в порядке), либо отключите автоматическое преобразование разрыва строки (у вас есть git config core.autocrlf false и .gitattributes).

person eis    schedule 04.12.2012