Добавьте псевдоним Git, содержащий точку с запятой
Когда я пытаюсь создать псевдоним
[alias]
my-alias = submodule foreach 'git foo ; git bar'
Git (версия 1.7.1) вызывает ошибку
[email protected]:/path/repo.git$ git my-alias
error: unclosed quote
fatal: Bad alias.my-alias string
Похоже, что .gitconfig
использует странные правила синтаксического анализа, поэтому ;
рассматривается как начало комментария строки даже внутри цитаты.
Как указать этот псевдоним?
Ответы
Ответ 1
Оберните всю команду псевдонима в двойные кавычки:
my-alias = "submodule foreach 'git foo ; git bar'"
Двойные кавычки заставляют парсер .gitconfig
пропускать точку с запятой. Одинаковые кавычки по-прежнему необходимы для разграничения аргумента на submodule foreach
; без них он анализируется как
submodule foreach 'git foo'
git bar
чтобы git bar
выполнялся только один раз, в конце.
Ответ 2
Не уверен, что это связано с точкой с запятой, но здесь идет - вот еще один тест для псевдонима git, используя bash
:
[alias]
testbash = "!bash -c \"ix=1; echo a\\$ix\""
Тест:
$ git testbash
a1
Любая другая форма escape дает мне либо обычную старую "фатальную: неправильную конфигурационную строку файла", либо "Unterminated quoteed string" или "неожиданный EOF" (см. также shell - Calling bash из sh (тире) с командами, считанными из args, и "Unterminated quoteed string" / "неожиданный EOF" - Unix и Linux Stack Exchange)
Также для многострочного:
[alias]
testbashm1 = "!bash -c \"ix=1; echo a\\$ix; \
echo b\\$ix \""
testbashm2 = "!bash -c 'ix=1; echo a$ix; \
echo b$ix '"
... и добавьте \n\
в конец строки, если вы хотите использовать inline bash
comments (#
):
[alias]
testbashm3 = "!bash -c 'ix=1; echo a$ix; \n\
#echo b$ix ; \n\
echo \"c$ix\" ; '"
Ответ 3
Вам нужно использовать doublequotes ("
), а не singlequotes ('
).
[alias]
foo = "submodule foreach 'echo foo; echo bar'"
bar = submodule foreach 'echo foo; echo bar'
$ git foo
foo
bar
$ git bar
fatal: Bad alias.bar string: unclosed quote
Ответ 4
У меня
[alias]
sm-clean-all = "submodule foreach --recursive 'git clean -fXd'"
Ответ 5
Просто оберните команду в двойные кавычки, например:
foo = !"echo foo; echo bar"
Чтобы включить точку с запятой для find
, дважды убегите в ней, например:
pull-all = !"find . -name .git -type d -print -execdir git pull origin \\;"
То же самое с вашей командой:
my-alias = "submodule foreach 'git foo; git bar'"
Для устранения неполадок префикс вашей команды GIT_TRACE=1
для отладки вашего псевдонима, например
$ GIT_TRACE=1 git my-alias
18:16:07.904421 git.c:282 trace: alias expansion: my-alias => 'submodule' 'foreach' 'git foo; git bar'
18:16:07.904437 git.c:557 trace: exec: 'git-submodule' 'foreach' 'git foo; git bar'
18:16:07.904443 run-command.c:347 trace: run_command: 'git-submodule' 'foreach' 'git foo; git bar'
Ответ 6
Для полной гибкости определите и вызовите функцию:
[alias]
conf = ! " \
f () { \
git config \"[email protected]\" --get-regexp . \
| sort; \
}; \
f"
Этот псевдоним можно назвать git conf
, git conf --local
или git conf --global
, а дополнительные опции вставлены в соответствующее место.