Не могу добавить псевдоним git при использовании функции оболочки

Я пытаюсь добавить следующий псевдоним с помощью функции оболочки

scommit = "!f() { git submodule foreach -q --recursive 'git commit -a || :' ; git commit -am \" Update submodule \";}; f"

Но когда я запускаю его в Git Bash (на Windows)

git config --local alias.scommit "!f() { git submodule foreach -q --recursive 'git commit -a || :' ; git commit -am "" Update submodule "";}; f"

Я получил вывод

git config --local alias.scommit "fit fetch upstream() { git submodule foreach -q --recursive 'git commit -a || :' ; git commit -am "" Update submodule "";}; f"

и, конечно, это не работает, потому что

Расширение псевдонима "scommit" не удалось; 'fit' - это не команда git

Также я попытался запустить его в PowerShell, но он показывает использование: git config [] …

Когда я добавляю его в.git/config вручную, он работает.

Как я могу добавить этот псевдоним с помощью git bash/ командной строки / PowerShell? Почему это превращается в fit fetch upstream()?

1 ответ

Решение

Я только что протестировал на Windows 10 с Git 2.18:

git config --local alias.scommit '!f() { git submodule foreach -q --recursive "git commit -a" || : ; git commit -am "Update submodule";}; f'

Идея состоит в том, чтобы инвертировать кавычки: сильные кавычки (') на внешней стороне псевдонима, слабые кавычки (") внутри.

Это позволяет избежать ! интерпретировать как расширенную команду из истории (как вы можете видеть здесь) (хотя set +o histexpand прежде чем команда git config могла бы помочь)

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