我正在尝试创建一个使用多个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'
任何见解都将受到赞赏。
答案 0 :(得分:139)
这将起作用(使用zsh和bash测试):
[alias] chs = !git checkout $1 && git status
答案 1 :(得分:64)
您可以定义shell函数。
[alias] chs = "!f(){ git checkout \"$1\" && git status; };f"
答案 2 :(得分:57)
这针对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
答案 3 :(得分:20)
我能够创建多行且非常复杂的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"
我写了一篇帖子,还有一些例子here。
答案 4 :(得分:15)
[alias]
chs = !git branch && git status
答案 5 :(得分:6)
试试这个:
[alias]
chs = "!sh -c 'git checkout \"$0\" && git status'"
这样称呼:git chs master
答案 6 :(得分:4)
通过在每行的末尾附加\
,可以使用多行git别名。
[alias]
chs = "!git checkout $1 \
; git status \
"
答案 7 :(得分:3)
这里的问题是位置参数似乎被发送到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
这将消耗额外的位置参数,因为它应用于最后一个echo命令并且对结果没有影响。
答案 8 :(得分:1)
[alias]
chs = !git checkout && git status
ac = !git add . && git commit -m
是什么! ?
<块引用>如果别名扩展以感叹号为前缀,它将被视为一个shell命令。 What does the exclamation mark mean in git config alias?
从 .gitconfig 文件调用别名
git chs
git ac "write_your_commit_message"
答案 9 :(得分:0)
一个想要尝试使用不同别名的人的示例。
将其放入GIT配置文件的别名部分(例如~/.gitconfig
):
[alias]
a0 = "!echo $*"
a1 = "!echo $* #"
a2 = "!f () { echo \"$*\"; }; f "
a3 = "!f () { echo \"$*\"; }; f #"
a4 = "!f () { echo \"$*\"; }; f \"$*\" #"
a5 = "!f () { echo \"$*\"; }; f \"$@\" #"
a6 = "!f () { echo \"$*\"; }; f \"$1\" #"
然后执行以下命令:
cat ~/.gitconfig | grep --extended-regexp -- '(a[0-9])|(alias)' ; \
echo "" ; \
export CMD ; \
for I in {0..6} ; \
do \
CMD="a""${I}" ; \
echo -n "Executing alias.${CMD} = " ; \
git config --global alias."${CMD}" ; \
git $CMD 'hoi daar' en nu? ; \
git $CMD hoi daar en nu? ; \
echo "" ; \
done ; \
unset CMD ;
应将此作为输出:
[alias]
a0 = "!echo $*"
a1 = "!echo $* #"
a2 = "!f () { echo \"$*\"; }; f "
a3 = "!f () { echo \"$*\"; }; f #"
a4 = "!f () { echo \"$*\"; }; f \"$*\" #"
a5 = "!f () { echo \"$*\"; }; f \"$@\" #"
a6 = "!f () { echo \"$*\"; }; f \"$1\" #"
Executing alias.a0 = !echo $*
hoi daar en nu? hoi daar en nu?
hoi daar en nu? hoi daar en nu?
Executing alias.a1 = !echo $* #
hoi daar en nu?
hoi daar en nu?
Executing alias.a2 = !f () { echo "$*"; }; f
hoi daar en nu?
hoi daar en nu?
Executing alias.a3 = !f () { echo "$*"; }; f #
Executing alias.a4 = !f () { echo "$*"; }; f "$*" #
hoi daar en nu?
hoi daar en nu?
Executing alias.a5 = !f () { echo "$*"; }; f "$@" #
hoi daar en nu?
hoi daar en nu?
Executing alias.a6 = !f () { echo "$*"; }; f "$1" #
hoi daar
hoi