В большинстве современных браузеров существует примитивный тип данных symbol , который можно использовать для создания перечисления. Это обеспечит безопасность типа перечисления, поскольку каждое значение символа гарантируется JavaScript, чтобы быть уникальным, то есть Symbol() != Symbol()
. Например:
const COLOR = Object.freeze({RED: Symbol(), BLUE: Symbol()});
Чтобы упростить отладку, вы можете добавить описание к значениям перечисления:
const COLOR = Object.freeze({RED: Symbol("RED"), BLUE: Symbol("BLUE")});
В GitHub вы можете найти оболочку, которая упрощает код, необходимый для инициализации перечисления:
const color = new Enum("RED", "BLUE")
color.RED.toString() // Symbol(RED)
color.getName(color.RED) // RED
color.size // 2
color.values() // Symbol(RED), Symbol(BLUE)
color.toString() // RED,BLUE
Я не пользователь Windows, поэтому отвечай мой ответ с солью. Согласно Cookbook Windows PowerShell , PowerShell предварительно обрабатывает вывод git diff
, разделяя его по строкам. Документация команды Out-File
предполагает, что >
совпадает с | Out-File
без параметров. Мы также находим этот комментарий в документации PowerShell :
Результаты использования командлета Out-File могут быть не такими, какие вы ожидаете, если вы привыкли к традиционному перенаправлению вывода , Чтобы понять его поведение, вы должны знать контекст, в котором работает командлет Out-File.
По умолчанию командлет Out-File создает файл Unicode. Это лучший дефолт в долгосрочной перспективе, но это означает, что инструменты, которые ожидают файлы ASCII, будут работать неправильно с выходным форматом по умолчанию. Вы можете изменить выходной формат по умолчанию на ASCII с помощью параметра Encoding:
[...]
Out-file форматирует содержимое файла, чтобы он выглядел как консольный вывод. Это приводит к усечению вывода так же, как и в консольном окне в большинстве случаев. [...]
Чтобы получить результат, который не заставляет привязки строк соответствовать ширине экрана, вы можете использовать параметр Width для указания ширины линии.
blockquote>So , по-видимому, это не Git, который выбирает кодировку символов, но
Out-File
. Это предполагает, a) что перенаправление PowerShell действительно должно использоваться только для текста и b) что| Out-File -encoding ASCII -Width 2147483647 my.patch
избежит проблем с кодировкой. Однако это все еще не решает проблему с линейными окончаниями Windows и Unix. Есть командлеты (см. PowerShell Community Extensions ) для преобразования строк.
Однако, вся эта перекодировка не повышает мою уверенность в патче (который не имеет кодировки сама по себе, а просто строка байтов). Вышеупомянутая Cookbook содержит сценарий 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
.
Как упоминалось Ларсом Нощинским, вам нужно исправить выход Out-File
. Вы можете установить DefaultParameter Out-File, используя следующие команды.
$PSDefaultParameterValues['Out-File:Encoding'] = 'ASCII'
$PSDefaultParameterValues['Out-File:Width'] = '2147483647'
После настройки параметров по умолчанию вы можете использовать >
для экспорта файла патча.
После добавив эти две строки в файл моего профиля, все работает так, как ожидалось.
λ git stash show -p > test3
C:\Users\..\Source\.. [master +1 ~0 -0 !]
λ git apply test3
C:\Users\..\Source\.. [master +1 ~2 -0 !]
В случае, если это поможет кому угодно, использование старой старой командной строки вместо PowerShell работает безупречно; он, похоже, не страдает от каких-либо проблем, присутствующих в PowerShell в отношении кодировки символов и EOL.
Если вы используете powershell, вы также можете просто сделать:
cmd /c "git diff > patch.diff"
Это заставляет команду запускаться через CMD, который записывает в выходной файл как есть.
Выполнение dos2unix на diff, создаваемом на PowerShell, кажется, делает трюк для меня. Затем я смог apply
выполнить diff.
dos2unix.exe diff_file
git apply diff_file