Ответ 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
.