gitconfig别名中的回显在只需要一个命令行参数时回显整个命令行参数列表



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

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的同时,echo调用正在将整个参数集附加到它上。事实上,如果我把事情搞砸了,把$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之间进行测试。

有人知道这里发生了什么吗?它打破了我的一些别名。。。

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

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。

最新更新