当我尝试创建别名
时[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
使用了奇怪的解析规则,因此;
被视为开始行注释,甚至在引号内。
如何指定此别名?
答案 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 conf
,git conf --local
或git conf --global
,并在适当的位置插入额外的选项。