Подтвердить что ты не робот

Git Оболочка в Windows: кодировка по умолчанию по умолчанию - UCS-2 Little Endian - как изменить это на ANSI или UTF-8 без спецификации?

При создании патча diff с Git оболочкой в ​​Windows (при использовании GitHub для Windows), кодировка символов патча будет UCS-2 Little Endian в соответствии с Notepad ++ (см. скриншоты ниже).

Как я могу изменить это поведение и заставить Git создавать патчи с ANSI или UTF-8 без кодировки символов спецификации?

Это вызывает проблему из-за того, что исправления с кодировкой UCS-2 Little Endian не могут применяться, я должен вручную преобразовать их в ANSI. Если я этого не сделаю, я получаю "фатальный: непризнанный вход" .

Создание  Git patch

Notepad ++ скриншот кодировки символов


С тех пор я также понял, что мне нужно вручную преобразовать EOL из формата Windows (\r\n) в UNIX (\n) в Notepad ++ (Edit > EOL Conversion > UNIX). Если я этого не сделаю, я получаю ошибку "trailing whitespace" (даже если все пробелы обрезаны: "TextFX" > "TextFX Edit" > "Trim Trailing Spaces" ).

Итак, шаги, которые мне нужно сделать для патча, который будет применяться:

Пожалуйста, взгляните на этот снимок экрана:

Применение патча в Windows Powershell с  Git проблематично

4b9b3361

Ответ 1

Я не пользователь Windows, поэтому отвечай мой ответ с солью. В соответствии с Windows PowerShell Cookbook PowerShell препроизводит вывод git diff, разделяя его по строкам. Документация Out-File Cmdlet предлагает, что > совпадает с | Out-File без параметров. Мы также находим этот комментарий в документации PowerShell:

Результаты использования командлета Out-File могут быть не такими, какие вы ожидаете, если вы привыкли к традиционному перенаправлению вывода. Чтобы понять его поведение, вы должны знать о контексте, в котором работает командлет Out-File.

По умолчанию командлет Out-File создает файл Unicode. Это лучший дефолт в долгосрочной перспективе, но это означает, что инструменты, которые ожидают файлы ASCII, будут работать неправильно с выходным форматом по умолчанию. Вы можете изменить формат вывода по умолчанию на ASCII, используя параметр Encoding:

[...]

Форматирование содержимого файлов Out-file, чтобы он выглядел как консольный вывод. Это приводит к усечению вывода так же, как и в консольном окне в большинстве случаев. [...]

Чтобы получить результат, который не заставляет привязки строк соответствовать ширине экрана, вы можете использовать параметр Width для указания ширины линии.

Итак, по-видимому, это не Git, который выбирает кодировку символов, но Out-File. Это предполагает, a) что перенаправление PowerShell действительно должно использоваться только для текста и b) что

| Out-File -encoding ASCII -Width 2147483647 my.patch

избежит проблем с кодировкой. Однако это все еще не решает проблему с линейными окончаниями Windows и Unix. Есть командлеты (см. Расширения сообщества PowerShell), чтобы выполнить преобразование строк.

Однако вся эта перекодировка не повышает мою уверенность в патче (который не имеет самой кодировки, а представляет собой просто строку байтов). Вышеупомянутый Cookbook содержит script Invoke-BinaryProcess, который можно использовать для перенаправления вывода команды без модификации.

Чтобы обойти эту проблему, альтернативой было бы использовать git format-patch вместо git diff. format-patch записывает непосредственно в файл (а не в stdout), поэтому его вывод не перекодируется. Тем не менее, он может создавать патчи только от коммитов, а не от произвольных различий.

format-patch принимает диапазон фиксации (например, master^10..master^5) или один фиксатор (например, X, что означает X..HEAD), и создает файлы патча формы NNNN-SUBJECT.patch, где NNNN является возрастающим 4- цифровое число и субъект - это искаженный объект патча. Выходной каталог можно указать с помощью -o.

Ответ 2

В случае, если это помогает кому угодно, использование старой старой командной строки вместо PowerShell работает безупречно; он, похоже, не страдает от каких-либо проблем, присутствующих в PowerShell в отношении кодировки символов и EOL.

введите описание изображения здесь

Ответ 3

Если вы используете powershell, вы также можете просто сделать:

cmd /c "git diff > patch.diff"

Это заставляет команду запускаться через CMD, который записывает в выходной файл как есть.

Ответ 4

  • Выходные данные Iconv diffs
  • Для простых 7-битных патчей (чистый английский) вы можете игнорировать безумное обнаружение Notepad ++: патч-контент не содержит определения charset

Ответ 5

Выполнение dos2unix на diff, создаваемом на PowerShell, кажется, делает трюк для меня. Затем я смог apply выполнить diff.

dos2unix.exe diff_file
git apply diff_file