Добавьте псевдоним Git, содержащий точку с запятой - PullRequest
8 голосов
/ 28 февраля 2012

Когда я пытаюсь создать псевдоним

[alias]
    my-alias = submodule foreach 'git foo ; git bar'

Git (версия 1.7.1) издает ошибку

user@host:/path/repo.git$ git my-alias
error: unclosed quote
fatal: Bad alias.my-alias string

Похоже, что .gitconfig использует странные правила синтаксического анализа, поэтому; рассматривается как начало комментария к строке, даже внутри кавычки.

Как указать этот псевдоним?

Ответы [ 6 ]

12 голосов
/ 28 февраля 2012

Оберните всю команду псевдонима в двойные кавычки:

my-alias = "submodule foreach 'git foo ; git bar'"

Двойные кавычки приводят к тому, что парсер .gitconfig пропускает точку с запятой.Одинарные кавычки по-прежнему необходимы для разделения аргумента на submodule foreach;без них он обрабатывается как

submodule foreach 'git foo'
git bar

, поэтому git bar выполняется только один раз в конце.

5 голосов
/ 22 апреля 2013

Не уверен, если это связано с точкой с запятой, но здесь идет - вот еще один тест для псевдонима git, используя bash:

[alias]
        testbash = "!bash -c \"ix=1; echo a\\$ix\""

test:

$ git testbash 
a1

Любая другая форма escape дает мне либо простой старый «фатальный: плохая строка файла конфигурации», либо «Неопределенная строка в кавычках», либо «неожиданный EOF» (см. Также shell - Вызов bash из sh (dash) с командами, считанными из argsи «Строка без кавычек» / «Неожиданный 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\ вконец строки, если вы хотите использовать встроенные bash комментарии (#):

[alias]
  testbashm3 = "!bash -c 'ix=1; echo a$ix; \n\
    #echo b$ix ; \n\
    echo \"c$ix\" ; '"
2 голосов
/ 28 февраля 2012

Вы должны использовать двойные кавычки ("), а не одинарные кавычки (').

[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
0 голосов
/ 22 апреля 2016

Для полной гибкости определите и вызовите функцию:

[alias]
    conf = ! "                                \
        f () {                                \
            git config \"$@\" --get-regexp .  \
            | sort;                           \
        };                                    \
        f"

Этот псевдоним можно назвать git conf, git conf --local или git conf --global, а дополнительные параметры вставляются в соответствующем месте.

0 голосов
/ 23 марта 2016

Просто заключите команду в двойные кавычки, например:

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'
0 голосов
/ 17 января 2013

у меня

[alias]
  sm-clean-all = "submodule foreach --recursive 'git clean -fXd'"
...