Dreamer Dreamer
首页
  • 分类
  • 标签
  • 归档
关于
GitHub (opens new window)

lycpan233

白日梦想家
首页
  • 分类
  • 标签
  • 归档
关于
GitHub (opens new window)
  • System

    • ZSH-Git 命令-tab 补全命令时候选项过多问题
      • 问题描述
      • 定位问题
      • Aliases
      • 解决方案
      • 结语
    • Windows 实现 ZSH Git 命令缩写(alias)
    • Windows PowerShell Posh-Git 配置命令缩写(alias)
    • wsl2 卡顿、Tab补全卡顿问题解决
  • 博客

  • IDE

  • OAuth

  • 大杂烩
  • System
lycpan233
2023-11-26
目录

ZSH-Git 命令-tab 补全命令时候选项过多问题

# 问题描述

笔者最近重新装了zsh环境,使用Tab补全某些命令时,发现与之前操作习惯不太一样,导致非常的难受。 例如: 输入 git chec + tab补全命令,之前默认会补全为 git checkout 。但目前的情况如下:

# 定位问题

  1. 确认是否是插件影响,因为笔者刚装的环境 zsh 的 pluging 仅有 git 一个插件。看过其文件以后确认git 插件只是定义了一些 git 命令的别名。 具体列表如下,命令还算全面。笔者本来打算,若解决不了这个问题就记别名使用了

# Aliases

Alias Command
g git
ga git add
gaa git add --all
gapa git add --patch
gau git add --update
gav git add --verbose
gap git apply
gapt git apply --3way
gb git branch
gba git branch -a
gbd git branch -d
gbda git branch --no-color --merged | grep -vE "^([+]|\s($(git_main_branch)|$(git_develop_branch))\s*$)" | xargs git branch -d 2>/dev/null
gbD git branch -D
gbl git blame -b -w
gbnm git branch --no-merged
gbr git branch --remote
gbs git bisect
gbsb git bisect bad
gbsg git bisect good
gbsr git bisect reset
gbss git bisect start
gc git commit -v
gc! git commit -v --amend
gcn! git commit -v --no-edit --amend
gca git commit -v -a
gca! git commit -v -a --amend
gcan! git commit -v -a --no-edit --amend
gcans! git commit -v -a -s --no-edit --amend
gcam git commit -a -m
gcas git commit -a -s
gcasm git commit -a -s -m
gcsm git commit -s -m
gcb git checkout -b
gcf git config --list
gcl git clone --recurse-submodules
gccd git clone --recurse-submodules "$@" && cd "$(basename $_ .git)"
gclean git clean -id
gpristine git reset --hard && git clean -dffx
gcm git checkout $(git_main_branch)
gcd git checkout $(git_develop_branch)
gcmsg git commit -m
gco git checkout
gcor git checkout --recurse-submodules
gcount git shortlog -sn
gcp git cherry-pick
gcpa git cherry-pick --abort
gcpc git cherry-pick --continue
gcs git commit -S
gd git diff
gdca git diff --cached
gdcw git diff --cached --word-diff
gdct git describe --tags $(git rev-list --tags --max-count=1)
gds git diff --staged
gdt git diff-tree --no-commit-id --name-only -r
gdnolock git diff $@ ":(exclude)package-lock.json" ":(exclude)*.lock"
gdup git diff @{upstream}
gdv git diff -w $@ | view -
gdw git diff --word-diff
gf git fetch
gfa git fetch --all --prune
gfg git ls-files | grep
gfo git fetch origin
gg git gui citool
gga git gui citool --amend
ggf git push --force origin $(current_branch)
ggfl git push --force-with-lease origin $(current_branch)
ggl git pull origin $(current_branch)
ggp git push origin $(current_branch)
ggpnp ggl && ggp
ggpull git pull origin "$(git_current_branch)"
ggpur ggu
ggpush git push origin "$(git_current_branch)"
ggsup git branch --set-upstream-to=origin/$(git_current_branch)
ggu git pull --rebase origin $(current_branch)
gpsup git push --set-upstream origin $(git_current_branch)
ghh git help
gignore git update-index --assume-unchanged
gignored git ls-files -v | grep
git-svn-dcommit-push git svn dcommit && git push github $(git_main_branch):svntrunk
gk gitk --all --branches &!
gke gitk --all $(git log -g --pretty=%h) &!
gl git pull
glg git log --stat
glgp git log --stat -p
glgg git log --graph
glgga git log --graph --decorate --all
glgm git log --graph --max-count=10
glo git log --oneline --decorate
glol git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset'
glols git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset' --stat
glod git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset'
glods git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset' --date=short
glola git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset' --all
glog git log --oneline --decorate --graph
gloga git log --oneline --decorate --graph --all
glp git log --pretty=<format>
gm git merge
gmom git merge origin/$(git_main_branch)
gmtl git mergetool --no-prompt
gmtlvim git mergetool --no-prompt --tool=vimdiff
gmum git merge upstream/$(git_main_branch)
gma git merge --abort
gp git push
gpd git push --dry-run
gpf git push --force-with-lease
gpf! git push --force
gpoat git push origin --all && git push origin --tags
gpr git pull --rebase
gpu git push upstream
gpv git push -v
gr git remote
gra git remote add
grb git rebase
grba git rebase --abort
grbc git rebase --continue
grbd git rebase $(git_develop_branch)
grbi git rebase -i
grbm git rebase $(git_main_branch)
grbom git rebase origin/$(git_main_branch)
grbo git rebase --onto
grbs git rebase --skip
grev git revert
grh git reset
grhh git reset --hard
groh git reset origin/$(git_current_branch) --hard
grm git rm
grmc git rm --cached
grmv git remote rename
grrm git remote remove
grs git restore
grset git remote set-url
grss git restore --source
grst git restore --staged
grt cd "$(git rev-parse --show-toplevel || echo .)"
gru git reset --
grup git remote update
grv git remote -v
gsb git status -sb
gsd git svn dcommit
gsh git show
gsi git submodule init
gsps git show --pretty=short --show-signature
gsr git svn rebase
gss git status -s
gst git status
gsta git stash push
gsta git stash save
gstaa git stash apply
gstc git stash clear
gstd git stash drop
gstl git stash list
gstp git stash pop
gsts git stash show --text
gstu git stash --include-untracked
gstall git stash --all
gsu git submodule update
gsw git switch
gswc git switch -c
gswm git switch $(git_main_branch)
gswd git switch $(git_develop_branch)
gts git tag -s
gtv git tag | sort -V
gtl gtl(){ git tag --sort=-v:refname -n -l ${1}* }; noglob gtl
gunignore git update-index --no-assume-unchanged
gunwip git log -n 1 | grep -q -c "--wip--" && git reset HEAD~1
gup git pull --rebase
gupv git pull --rebase -v
gupa git pull --rebase --autostash
gupav git pull --rebase --autostash -v
glum git pull upstream $(git_main_branch)
gwch git whatchanged -p --abbrev-commit --pretty=medium
gwip git add -A; git rm $(git ls-files --deleted) 2> /dev/null; git commit --no-verify --no-gpg-sign -m "--wip-- [skip ci]"
gam git am
gamc git am --continue
gams git am --skip
gama git am --abort
gamscp git am --show-current-patch
  1. git 版本 ,或者 zsh 版本问题,笔者找了几位同事对比版本号,发现可能是 zsh 版本造成的原因。

具体的区别在于x86_64-apple-darwin21.0 这点后缀,因为笔者没搜到相关信息,没办法针对这个猜想进行验证。

# 解决方案

功夫不负有心人,笔者在搜索相关资料时看到了这篇文章:

hiding certain options in zsh autocompletion (opens new window)

具体步骤:

  1. vim ~/.zshrc

笔者这里屏蔽了check-* 相关命令 和 cheery 的两个命令 编辑 zsh 配置文件 ,追加以下代码:

zstyle ':completion::complete:git:*:*' ignored-patterns 'check*-*' 'cherry' 'cherry-pick'
1
  1. 重新载入配置文件
source ~/.zshrc
1

或者

zsh
1
  1. 开启一个新终端验证

# 结语

当前的配置已经满足笔者的需求,如果各位小伙伴想深究原理可以看一下下面这篇文档。

Standard Styles (opens new window)

编辑 (opens new window)
上次更新: 2025/04/15, 03:48:14
Windows 实现 ZSH Git 命令缩写(alias)

Windows 实现 ZSH Git 命令缩写(alias)→

最近更新
01
docker基础概念
02-26
02
js 获取变量准确类型
02-19
03
Mysql SQL 优化思路
02-18
更多文章>
Theme by Vdoing | Copyright © 2023-2025 Dreamer | MIT License
粤ICP备2025379918号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式