我正在尝试创建一个同时使用多个 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 和 bash 测试):
[alias] chs = !git checkout $1 && git status
这针对 Windows 批处理/msysgit bash;可能不适用于其他环境。
正如 Olivier Verdier 和 Lily 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
您可以定义一个shell函数。
[alias] chs = "!f(){ git checkout \"$1\" && git status; };f"
我能够创建多行且相当复杂的 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 = !git checkout && git status
ac = !git add . && git commit -m
是什么! ?
如果别名扩展带有感叹号前缀,它将被视为 shell 命令。 git config 别名中的感叹号是什么意思?
从 .gitconfig 文件调用别名
git chs
git ac "write_your_commit_message"
试试这个:
[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
这将消耗额外的位置参数,因为它应用于最后一个回显命令,并且对结果没有影响。
为想要尝试不同别名功能的人提供的示例。
将其放入 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
这是一篇旧帖子,但没有人提供我认为最简单的解决方案。这在我基于 *nix 的 CLI 中有效,您的情况可能会有所不同。
[alias]
chs = "!git checkout $1; git status"
一个简单的分号 (;) 就可以运行多个 git 命令。
Lily Ballard 对 shell 函数有一个很好的答案,当我们通过管道传输所有别名参数时看起来更好:
[alias] chs = "!f(){ git checkout \"${@:1}\" && git status; };f"
cmu = "!f() { git add . && git commit -m $1 && git push -u origin $2; }; f"[enter image description here][1]