Как я могу исправить конфликтующие символы между git и powershell?

Когда я указываю версии gitrevision в pwsh (например, HEAD@{3}), я должен условно не забыть заключить версию gitrevision в кавычки. Если я этого не сделаю, он будет рассматривать «@» как оператор подвыражения массива.

Пример:

pwsh$ git checkout HEAD@{3}

fatal: ambiguous argument ‘HEAD@‘: unknown revision or path not in the
working tree

Как я могу настроить git (2.44.0) или pwsh (7.4.2), чтобы предотвратить появление этих конфликтующих символов?

Я пробовал использовать псевдонимы git и pwsh, но они оба являются только псевдонимами команд.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как я могу настроить git (2.44.0) или pwsh (7.4.2), чтобы предотвратить появление этих конфликтующих символов?

Вы не можете. Вы не можете обойти правила синтаксиса используемой вами оболочки.

PowerShell необычен тем, что в нем больше метасимволов (символов со специальным значением), чем в других оболочках, в частности, включая @ { } , ; ` (подробности см. в этом ответе).

Чтобы использовать эти символы дословно, вам необходимо:

  • либо: экранируйте их по отдельности, используя ` (обратный апостроф), escape-символ PowerShell .

    • Например, git ... HEAD@`{3`} — обратите внимание, что @ в этом случае не требует экранирования, поскольку он встречается внутри аргумента.
  • или: заключите весь аргумент, содержащий метасимволы, в кавычки (либо '...' для создания дословных строк, либо "..." для расширяемых (интерполирующих).

    • Например, git ... 'HEAD@{3}'

Существует строго ограниченный способ запретить PowerShell применять свои обычные правила синтаксического анализа, а именно --%, токен остановки синтаксического анализа (сводку ограничений см. в нижней части этого ответа).
Однако вам все равно нужно не забывать использовать его при необходимости.[1]

  • Например, git ... --% HEAD@{3}

Я должен условно не забыть заключить его в кавычки.

Если вы не хотите узнавать, какие (дополнительные) символы необходимо экранировать или заключать в кавычки в PowerShell, единственный вариант — вызвать другую оболочку, например cmd.exe в Windows, и передать командную строку для вызова в виде одной строки.
Однако это может создать проблемы с цитированием и снизить производительность.

  • Например, cmd /c 'git ... HEAD@{3}'

[1] To ease the pain of typing --%, jthill suggests defining a keyboard shortcut such as Alt+/ that automatically inserts it. You can do so by placing the following in your $PROFILE file:
Set-PSReadLineKeyHandler -Chord Alt+/ -ScriptBlock { [Microsoft.PowerShell.PSConsoleReadLine]::Insert('--%') }.
Note that on Unix-like platforms the set of key chords available to the PSReadLine module is limited, as discussed in this GitHub comment; e.g. Ctrl+/ works only on Windows.

Хм. Bash использует readline, у меня есть ctrl-/, привязанный к ~/ там и в моем редакторе, есть ли в PowerShell возможность привязки клавиш, чтобы вы могли легко печатать --% там?

jthill 18.06.2024 23:01

@jthill, пожалуйста, прочти мое обновление (сноска).

mklement0 18.06.2024 23:24

каждый эмулятор терминала, который я знаю, предоставляет ctrl-/ как ascii ctrl-_ (поскольку / находится за пределами диапазона ascii переключения бита ctrl), ctrl-/ у меня работает нормально.

jthill 18.06.2024 23:55

@jthill, это может быть ограничение PowerShell (в частности, его модуля PSReadLine) и/или API .NET. По крайней мере, лично я не могу заставить Ctrl+/ работать в macOS и WSL в PowerShell. Связанный комментарий GitHub содержит дополнительную информацию.

mklement0 19.06.2024 00:06

Попробуйте Set-PSReadLineKeyHandler -Chord Ctrl+_ -ScriptBlock { [Microsoft.PowerShell.PSConsoleReadLine]::Insert('--%') }, я, вероятно, не помог, не упомянув, какой код на самом деле генерируют нажатия клавиш, извините за это.

jthill 19.06.2024 01:29

Спасибо, @jthill, но у меня это не работает ни в macOS, ни внутри WSL.

mklement0 19.06.2024 01:57

Другие вопросы по теме