gitconfig别名中的Echos在只有一个预期时回显整个命令行参数列表

时间:2014-02-19 14:56:47

标签: git git-config git-alias

很长一段时间,我在别名文件中有以下别名:

ignore=!([ ! -e .gitignore ] && touch .gitignore) | echo $1 >>.gitignore

这对我来说不是原创,如果你搜索它,你会看到很多地方。然而,最近,我开始对别名产生一个奇怪的问题。我忽略的任何内容都会在.gitignore文件和同一行(只有空格)中放置两次。

我进行了一些调试,发现真正发生的事情是echo $1的调用正如您所期望的那样回显$1,但也回显了别名的整个参数字符串。

为了测试这个,我做了一个新的别名:

eo = !echo $1

> git eo test
test test    

> git eo test0 test1
test0 test0 test1

最后一行是最有趣的,因为它清楚地表明,当$1被正确评估时,回调调用会将整个参数集添加到它上面。事实上,如果我弄乱了所有内容并将$1更改为$9(并且不填写$9),我会得到:

> git eo test0 test1
test0 test1

我已经确认这发生在Git版本1.8.5到1.9.0上,我已经确认它不会发生在Git版本1.7.1中;不幸的是,我无法在1.7.1和1.8.5之间进行测试。

有没有人对这里发生的事情有任何见解?它打破了我的一些别名......

1 个答案:

答案 0 :(得分:3)

我认为扩张不是你所期望的。让我们从您的别名开始:

eo = !echo $1

我相信git eo test正在扩展为:

echo $1 test

然后将其扩展为:

echo test test

git查看别名的典型方法是说当我说“eo”时,我希望你运行“echo $ 1”并将所有参数传递给该命令。这允许你做像

这样的事情
[alias]
k = !gitk

仍然可以将参数传递给git k。如果你希望它的行为不同,你应该通过shell调用传递它:

[alias]
eo = !sh -c 'echo $1' -

然后你会得到预期的结果。

我认为对于你的忽略别名,你想要像

这样的东西
[alias]
ignore = !sh -c 'echo "$1" >> .gitignore' -

注意:您无需触摸文件>>即可使用,而在您的原始别名中,您可能需要使用;而不是将触摸输出传输回echo。