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