Git别名将参数附加到结尾

Cra*_*tis 8 git

我正在使用Git Bash v1.8.1,带有一些别名(用于测试):

[alias]
    ekko = !echo $1 && echo $1
    ekko2 = !sh -c 'echo $1 && echo $1'
Run Code Online (Sandbox Code Playgroud)

但是当我运行它们时,我看到:

> git ekko master
master
master master
Run Code Online (Sandbox Code Playgroud)

和:

> git ekko2 master
(blank line) 
(blank line) 
Run Code Online (Sandbox Code Playgroud)

我的预期行为是:

> git ekko master
master
master
Run Code Online (Sandbox Code Playgroud)

我对别名相当新 - 我正在寻找一种方法来确保我的参数被完全消耗,而不是附加到别名的末尾.一些调查表明这种行为在Git v1.7.x附近发生了变化,我还没有确定如何完成这个:

Git Alias - 多个命令和参数

Aje*_*i32 15

你的ekko2别名非常接近......你真正想要的是这个:

[alias]
    ekko2 = !sh -c 'echo $1 && echo $1' -
Run Code Online (Sandbox Code Playgroud)

执行shell命令的Git别名会替换$n变量,但它们还会将您传递给它们的任何参数附加到命令的末尾.所以在你的第一个例子git ekko master中相当于echo master && echo master master,它解释了它的输出.

你的第二个例子更接近,但是你将"master"传递给sh命令,这只是忽略了额外的参数.通过添加-到别名的末尾,您将告知后面sh的参数是针对脚本sh执行的,而不是为sh自己执行.

  • 仅仅为了记录,另一种相对常见的方法是使用一个函数:`ekko2 ="!f(){echo $ 1 && echo $ 1}; f"`.它可能稍微有点效率,因为它避免分支第二个外壳,我认为...... (3认同)
  • 对我来说,`ekko2 = "!echo $1; echo $2 #"` 有效。`#` 抑制了该行的其余部分。 (3认同)

小智 5

ekko2 最后缺少一个短划线:

[alias]
    ekko2 = !sh -c 'echo $1 && echo $1' -
Run Code Online (Sandbox Code Playgroud)

请参阅带有参数的高级别名Git Wiki:

[alias]
    example = !sh -c 'ls $2 $1' -
Run Code Online (Sandbox Code Playgroud)