Git别名 – 多个命令和参数

我正在尝试创build一个使用多个Git命令和位置参数的别名。 每个页面都有一个Stackoverflow页面,这两个页面都显得很痛苦,但是我遇到了麻烦。

作为一个例子,我想切换到分支foo并执行状态。 所以在我的.gitconfig ,我有:

  [alias] chs = !sh -c 'git checkout $0 && git status' 

这不起作用。 而像这样的东西将工作。

 chs = !sh -c 'git checkout $0' echoes = !sh -c 'echo hi && echo bye' 

任何有识之士将不胜感激。

这将工作(用zsh和bashtesting):

 [alias] chs = !git checkout $1 && git status 

你可以定义一个shell函数。

 [alias] chs = "!f(){ git checkout \"$1\" && git status; };f" 

这针对Windows批处理/ msysgit bash; 可能无法在其他环境中工作。

正如Olivier Verdier和Kevin Ballard所说的那样

[alias] chs = !git checkout $1 && git status

几乎可以工作,但会给出一个假的额外插入的参数…

git chs demo -> git checkout demo && git status demo

但是,如果将&& :添加到别名的末尾,则虚假参数将被消耗到位置标记中。

所以

 [alias] chs = !git checkout $1 && git status && : 

给出正确的输出… git chs demo -> git checkout demo && git status

我能够创build多行和相当复杂的git别名。 他们在Windows上工作正常,但我认为他们也可以在别处工作,例如:

 safereset = "!f() { \ trap 'echo ERROR: Operation failed; return' ERR; \ echo Making sure there are no changes...; \ last_status=$(git status --porcelain);\ if [[ $last_status != \"\" ]]; then\ echo There are dirty files:;\ echo \"$last_status\";\ echo;\ echo -n \"Enter Y if you would like to DISCARD these changes or W to commit them as WIP: \";\ read dirty_operation;\ if [ \"$dirty_operation\" == \"Y\" ]; then \ echo Resetting...;\ git reset --hard;\ elif [ \"$dirty_operation\" == \"W\" ]; then\ echo Comitting WIP...;\ git commit -a --message='WIP' > /dev/null && echo WIP Comitted;\ else\ echo Operation cancelled;\ exit 1;\ fi;\ fi;\ }; \ f" 

我写了一篇文章,并在这里有更多的例子。

 [alias] chs = !git branch && git status 

试试这个:

 [alias] chs = "!sh -c 'git checkout \"$0\" && git status'" 

像这样调用它: git chs master

通过在每行的末尾添加\可能会有多行git别名。

 [alias] chs = "!git checkout $1 \ ; git status \ " 

这里的问题是位置参数似乎被发送到shell命令两次(如git 1.9.2)。 看看我的意思,试试这个:

 [alias] test = !git echo $* 

然后,做git test this is my testing string 。 你应该观察下面的输出(为清楚起见,在这里编辑的最后两行):

 03:41:24 (release) ~/Projects/iOS$ git test this is my testing string this is my testing string this is my testing string ^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^ #1 #2 

解决这个问题的一种方法是

 [alias] chs = !git checkout $1 && git status && git echo x >/dev/null 

这将消耗额外的位置参数,因为它被应用到最后的回声命令并且对结果没有影响。