Добавьте псевдоним 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, а дополнительные опции вставлены в соответствующее место.