I'm using Git Bash v1.8.1, with a few aliases (for testing):
[alias]
    ekko = !echo $1 && echo $1
    ekko2 = !sh -c 'echo $1 && echo $1'
But when I run them, I see:
> git ekko master
master
master master
And:
> git ekko2 master
(blank line) 
(blank line) 
My intended behavior is:
> git ekko master
master
master
I'm fairly new to aliases - I'm looking for a way to ensure that my arguments are consumed entirely, and not appended to the end of the alias. Some sleuthing indicates this behavior changed somewhere around Git v1.7.x, and I haven't yet determined exactly how to accomplish this:
Git Alias - Multiple Commands and Parameters
Your ekko2 alias is really close... What you really want is this:
[alias]
    ekko2 = !sh -c 'echo $1 && echo $1' -
Git aliases that execute shell commands do substitute the $n variables, but they also append any arguments you pass them to the end of the command. So in your first example git ekko master is equivalent to echo master && echo master master, which explains its output.
Your second example is closer, but you're passing "master" to the sh command, which is just ignoring the extra argument. By adding - to the end of the alias, you're telling sh that the arguments that follow are intended for the script sh is executing, and not for sh itself.
You can add a Bash noop command ":" at the end:
git config --global alias.hello-world '!echo "$1"; :'
Prints:
$ git hello-world hello world
hello world
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With