34

If I do this:

alias g='git'

I loose all completion rules (i.e. branches and remotes are no longer being automatically completed when I hit TAB after typing, for example g push o).

5
  • While I don't have an answer for you, I'm going to have to take a minute and wonder if not typing those two other letters is really giving you much of an advantage? Sep 19, 2011 at 13:17
  • 4
    Sure it does! I'm typing 'g' probably over a 100 times a day. Sep 19, 2011 at 13:29
  • 3
    Aliasing often-used short commands to even shorter aliases saves me hundreds of keypresses a day. According to my shell history, I have used the alias g=git 756 times in the past month, meaning I saved pressing the 'g' and 'i' keys 1512 times total. That, combined with my git aliases, probably saves me tens of thousands of key presses a month.
    – user97589
    Dec 12, 2012 at 1:56
  • The main point of shortening keystrokes is helping your hands keep up with your brain. Feb 26, 2015 at 23:37
  • The script at superuser.com/questions/436314/… worked so well I think it deserves a mention.
    – brandizzi
    May 26, 2016 at 14:50

8 Answers 8

36

Latest bash-completion upstream moved and renamed things a bit. It's now:

source /usr/share/bash-completion/completions/git
__git_complete g __git_main

Use this in recent versions of Ubuntu (e.g. 14.04, also Fedora 22+) when you encounter:

completion: function `_git' not found

during completing.

6
  • 2
    Seems like this is the only correct answer here. Nov 3, 2015 at 6:17
  • Use __git_complete gc _git_checkout (or similar) to set up completions for more specific aliases. Search /usr/.../git as above to find the right name. Nov 6, 2015 at 18:00
  • 2
    @MaxWallace - when you set the aliases for particular git methods in .gitconfig (e.g. gc = checkout), there is no need to explicitly configure completion for them. Oct 22, 2016 at 7:43
  • 1
    @PiotrAleksanderChmielowski Thanks! But I don't think that works for top-level bash aliases (e.g. gc => git checkout) as opposed to aliasing c to checkout within git, and saying git c. Correct me if I'm wrong. Oct 24, 2016 at 12:33
  • @MaxWallace Yes, you are right, my mistake ;) Oct 24, 2016 at 15:39
21

Copying and modifying opportunely from /etc/bash_completion.d/git, add the following lines to your ~/.bashrc:

complete -o bashdefault -o default -o nospace -F _git g 2>/dev/null \
    || complete -o default -o nospace -F _git g
3
  • Ha! Wunderbar! Works just like it should :) Sep 19, 2011 at 13:32
  • 1
    I also had to add source /usr/share/bash-completion/completions/git to my .bashrc
    – pcx
    Aug 21, 2014 at 6:46
  • Not sure if the .bashrc code here works, but this answer is definitely out of date. /etc/bash_completion.d/git doesn't seem to exist on 14.04. See lzap's answer below. Nov 6, 2015 at 18:04
9

In ~/.bashrc:

alias g='git'
source /usr/share/bash-completion/completions/git
complete -o default -o nospace -F _git g

Via http://29a.ch/2013/8/9/fixing-bash-autocomplete-on-ubuntu-13-04

1
  • I upvoted this in 2015, but it no longer works for me on Ubuntu 22.04 with git 2.34.1. I still like alias g='git', but I use Izap's answer to this question for the bash completion. Nov 14, 2022 at 20:54
4

First, look up the original completion command. Example:

$ complete | grep git

complete -o bashdefault -o default -o nospace -F __git_wrap__git_main git

Now add these to your startup script (e.g. ~/.bashrc):

# copy the original statement, but replace the last command (git) with your alias (g)
complete -o bashdefault -o default -o nospace -F __git_wrap__git_main g

# load dynamically loaded completion functions (may not be required)
_completion_loader git

The _completion_loader line may not be required. But for some situations, the completion function is only loaded dynamically after you type the command and press TAB the first time. So if you haven't used the original command, and try the alias + TAB, you may get an error like "bash: completion: function not found".

1
  • Works great. For me this is the correct answer, the grep command on complete is handy. Did not need the completion loader. Apr 25, 2019 at 0:19
1

The updated way to do this (complete wouldn't work for me):

  1. cd - switch to your home directory
  2. wget https://raw.github.com/git/git/master/contrib/completion/git-completion.bash
  3. Add source ~/git-completion.bash to your .bashrc file (if you don't have this file make one in your home folder, bash will look for it automatically)
  4. Add alias g='git'to your .bashrc file.
  5. Start a new session or source your changes with source ~/.bashrc
1
  • 3
    You skipped the part where they actually added completion in the comment you linked to: __git_complete g _git Nov 3, 2015 at 6:08
0

Just for the sake of completeness, I'd like to add an answer using the ~/.bash-completion file, which gets sourced at the end of the bash-completion script:

_xfunc git __git_complete g __git_main
_xfunc git __git_complete gl _git_log
_xfunc git __git_complete gd _git_diff
_xfunc git __git_complete gb _git_branch

Then in my ~/.bashrc I have just the aliases. I was trying to:

  • avoid poluting my ~/.bashrc with bash-completion stuff (keep stuff where it belongs) ✓
  • avoid sourcing the whole git-completion into my shell ☹

Unforutnately the _xfunc sources the git-completion anyway. I'll update this answer once I figure out how to do it properly (I also asked on lunchpad here).

-1

Look at here: https://gist.github.com/scue/576310b7c6b7714aad05

wget https://gist.github.com/scue/576310b7c6b7714aad05/raw/459d46761c231f5c373c1cf496920b01bb6669d2/.bash_aliases.git -O ~/.bash_aliases.git
echo "test -e ~/.bash_aliases.git && source ~/.bash_aliases.git" >> ~/.bashrc

Enjoy!(^o^)/

2
-1

You may just define aliases as usual:

alias g='git'

Then install complete-alias to make bash completion alias-aware.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .