Reputation: 3351
No matter what I try and do I can't seem to make git tab/auto completion work in my zsh shell. I've downloaded the bash-completion script and the zsh-completion one and followed the instructions, but I can't make it work.
I've reinstalled oh-my-zsh but that didn't seem to help or make any difference.
Can anyone who's got it working describe to me their setup so I can try an emulate it to get it working for me?
To be specific, what I've done so far is:
~/.completion/git/git-completion.sh
~/.zsh/_git
zstyle ':completion:*:*:git:*' script ~/.completion/git/git-completion.sh
No luck.
Upvotes: 222
Views: 111174
Reputation: 8078
I wrote a more thorough answer here. But if you have git installed via brew and are using zsh
, this should fix auto completions (and give you dope autocompletions for every other brew function)
# Init Homebrew to get `HOMEBREW_PREFIX`
eval "$(brew shellenv)"
# Delete brew's objectively worse git completion
remove_conflicting_git_completions() {
local git_completion_bash="$HOMEBREW_PREFIX/share/zsh/site-functions/git-completion.bash"
local git_completion_zsh="$HOMEBREW_PREFIX/share/zsh/site-functions/_git"
[ -e "$git_completion_bash" ] && rm "$git_completion_bash"
[ -e "$git_completion_zsh" ] && rm "$git_completion_zsh"
}
# This needs to run every time since brew sometimes brings those files back
remove_conflicting_git_completions
# Add Homebrew's site functions to fpath (minus git, because that causes conflicts)
# This will give you autocomplete for _other_ things you installed
# from brew (like `just`, or `exa`, or `k6`)
fpath=($HOMEBREW_PREFIX/share/zsh/site-functions $fpath)
Upvotes: 1
Reputation: 21126
echo 'autoload -Uz compinit && compinit' >> ~/.zshrc && . ~/.zshrc
this will enable completion in .zshrc and apply the setting to your current terminal session.
Actually, ZSH does know how to do git completion out of the box, but you need to turn on the completion feature itself (which from the steps you described I guess you haven't done)
Adding this to your .zshrc
should be enough:
autoload -Uz compinit && compinit
After you put the line .zshrc
file, don't forget to restart the shell for ZSH to pick up the new config (alternatively, you can execute the line in your current session, that'll enable autocompletion for that one session)
zsh compinit: insecure directories
warningThanks to @FranMorzoa for suggesting to use compinit -u
to skip the security checks for completion scripts
While this will get rid of the warning/confirmation, the warning is there for a reason and it shouldn't happen normally.
It is a sign that something is wrong with ownership of the completion scripts, and it can (and should) be fixed with one of these:
brew.sh version:
chmod -R go-w "$(brew --prefix)/share"
another one, will probably work for non-brew zsh, credits to pvinis on GitHub:
compaudit | xargs chmod g-w
PS Another answer here suggests installing the hub
tool instead: although the tool is handy, it's merely a 3rd party (github community) wrapper around git. Hence, it has nothing to do with the topic of "Git completion in ZSH"
Upvotes: 524
Reputation: 1985
mkdir -p ~/.zsh/completions
curl "https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.zsh" > ~/.zsh/completions/_git
chmod a+x ~/.zsh/completions/_git
cat ~/.zshrc | grep 'fpath=(~/.zsh/completions $fpath)' > /dev/null || echo 'fpath=(~/.zsh/completions $fpath)' >> ~/.zshrc
cat ~/.zshrc | grep 'autoload -Uz compinit && compinit' > /dev/null || echo 'autoload -Uz compinit && compinit' >> ~/.zshrc
source ~/.zshrc
Or just run brew install zsh-completions
and follow the instructions.
Upvotes: 2
Reputation: 2158
If nothing helps, try to remove symlink /usr/local/share/zsh/site-functions/_git
that appears after installation git with Homebrew brew install git
Upvotes: 4
Reputation: 6838
Turns out the problem for me wass that when installing git via homebrew, git installs its own zsh shell extension which is considerably less complete/capable than the default that oh-my-szh installs. Find out what versions your git install is and then remove the zsh autocompletions. Mine were here and deleted thusly:
rm -rf /usr/local/Cellar/git/2.28.0/share/zsh/
This is not to say that the problem could not be any one of the other answers or a combination of.
Upvotes: 4
Reputation: 818
For the 2019 viewer:
If you use ZSH:
brew install hub
mkdir ~/.zsh
and mkdir ~/.zsh/completions
Once you got your directory created and hub installed, you have to cp
the hub.bash_completion.sh
file to your local zsh/completion
folder.
(Mine was cp /usr/local/etc/bash_completion.d/hub.bash_completion.sh ~/.zsh/completions/_hub
)
Then you add the following line to your ~/.zshrc
file :
fpath=(~/.zsh/completions $fpath)
autoload -U compinit && compinit
then source ~/.zshrc
and voilà ! You should have the git completion available
source : https://github.com/github/hub/tree/master/etc#zsh
Upvotes: 25
Reputation: 1
The same issue bothers me today. Inspired by the answers, I looked around the .zshrc and found this:
Which plugins would you like to load? (plugins can be found in ~/.oh-my-zsh/plugins/*)
Custom plugins may be added to ~/.oh-my-zsh/custom/plugins/
Example format: plugins=(rails git textmate ruby lighthouse)
Add wisely, as too many plugins slow down shell startup.
plugins=(git)
Just comment the above line to enable the git plugin, the problem is solved. More details about the plugin can be found here: https://github.com/robbyrussell/oh-my-zsh/tree/master/plugins/git
Upvotes: 0
Reputation: 3351
The answer was that I had alias git=hub
in my .zshrc
file. See https://github.com/github/hub for info on hub (it's awesome).
Here's a link to info about the problem I was having with hub and git completion: https://github.com/github/hub/issues/586#issuecomment-47727226
Upvotes: 23