添加包含分号的Git别名

时间:2012-02-28 08:20:31

标签: git parsing git-config

当我尝试创建别名

[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 个答案:

答案 0 :(得分:12)

用双引号括起整个别名命令:

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

双引号会导致.gitconfig解析器传递分号。仍需要单引号将参数分隔为submodule foreach;没有它们,它会被解析为

submodule foreach 'git foo'
git bar

这样git bar只会在最后执行一次。

答案 1 :(得分:4)

不确定这是否与分号有关,但是这里是 - 这是git别名的另一个测试,使用bash

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

试验:

$ git testbash 
a1

任何其他形式的转义都会给我一个简单的“致命:错误的配置文件行”或“未终止的引用字符串”或“意外的EOF”(另请参阅shell - Calling bash from sh (dash) with commands read from args, and "Unterminated quoted string"/"unexpected 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 :(得分:2)

您需要使用双引号(")而不是单引号(')。

[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

答案 3 :(得分:0)

我有

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

答案 4 :(得分:0)

只需将命令包装成双引号,例如:

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'

答案 5 :(得分:0)

为了获得完全的灵活性,请定义并调用函数:

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

此别名可以称为git confgit conf --localgit conf --global,并在适当的位置插入额外的选项。