在使用git checkout
功能时,我创建了一个名为“gc”的脚本来自动填充git分支名称,例如键入gc mob-102
然后按两次选项卡将显示匹配的分支名称,例如mob-1025-a,mob-1025-b,mob-1021-end等。
function gc() {
git checkout "$1"
}
_gc() {
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
local branch_names=$(git branch|xargs basename|grep -v '*')
local tag_names=$(git tag)
local remote_branch_names=$(git branch -r|xargs basename|grep -Ev "HEAD|->")
local all_branch_and_tag_names=${branch_names}${remote_branch_names}${tag_names}
COMPREPLY=($(compgen -W "${all_branch_and_tag_names}" $cur))
}
complete -F _gc gc
我把它放到我的.bash_profile中,这很好。但是,现在我正在尝试添加一个可选的“-b”选项,这样你就可以拥有git checkout -b <new branch name>
功能,即从当前分支创建一个新的分支,例如
gc -b my_new_branch
。如果你没有传递“-b”选项,我希望自动完成功能像以前一样工作。
之前我在其他脚本中使用过getopts
,但我似乎无法让它工作。我试过的一种方法是:
function gc() {
if [[ $# -gt 1 ]]
then
echo "There is more than one argument on the command line"
while getopts ":b:" opt; do
echo "Got an option: $OPTARG"
case $opt in
b)
echo "Got the -b option with $OPTARG"
git checkout -b "$OPTARG"
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
esac
done
else
gc_branch_complete "$1"
fi
}
function gc_branch_complete() {
git checkout "$1"
}
_gc() {
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
local branch_names=$(git branch|xargs basename|grep -v '*')
local tag_names=$(git tag)
local remote_branch_names=$(git branch -r|xargs basename|grep -Ev "HEAD|->")
local all_branch_and_tag_names=${branch_names}${remote_branch_names}${tag_names}
COMPREPLY=($(compgen -W "${all_branch_and_tag_names}" $cur))
}
complete -F _gc gc_branch_complete
奇怪的是,这似乎在第一次运行时起作用,但在随后的调用中却没有。
有没有比这更好的方法?