git-completion がエイリアスでも効くようにしてブランチ名をタブ補完する

git checkout の後にタブ補完でブランチ名を入力したりしたかったので、やり方を調べた。

目次

git-completion.bash の準備

Git では git-completion.bash というタブ補完用のスクリプトが用意されており、コレを .bash_profile などで読み込めばタブ補完が使えるようになる。

このファイルについては、以前記事を書いたのだが、その時は Homebrew でインストールした Git のディレクトリ配下から直接読み込むようにしていた。

今回はエイリアスに対応させるため、git-completion.bash を別途用意する。

ということで、まずは以下の Git 公式のリポジトリより git-completion.bash をダウンロードする。GitHub のページなので、「Raw」リンクからリンク先をダウンロードしたりすると良いだろう。

コレを ~/git-completion.bash という位置に置いたことにする。

Bash 起動時に git-completion.bash を読み込むようにする

次に、このスクリプトを Bash 起動時に読み込むようにする。~/.bash_profile に以下のように記載する

# Git コマンドのタブ補完用スクリプトを読み込む
test -r ~/git-completion.bash && . ~/git-completion.bash

念のため、そのファイルが存在したら読み込む、という風に書いている。

エイリアスでも動作するようにする

コレでひとまず、$ git checkout と入力した後にタブで入力補完されるようになった。

しかし、自分は git checkout というコマンドを gco というエイリアスで使っているのだが、このタブ補完はエイリアスだと効かないのだ。

そこで、git-completion.bash を以下のように編集し、エイリアス向けに補完スクリプトを設定してやると上手くいった。

# …中略…
__git_complete git __git_main
__git_complete gitk __gitk_main

# ↑ココまで元々の行
# 以下でエイリアス用に補完スクリプトを設定する
# Git
__git_complete g __git_main
# Add
__git_complete ga _git_add
# Branch
__git_complete gb _git_branch
__git_complete gba _git_branch
__git_complete gbd _git_branch
# Checkout
__git_complete gco _git_checkout
__git_complete gcob _git_checkout
# Commit
__git_complete gc _git_commit
__git_complete gce _git_commit
__git_complete gcem _git_commit
__git_complete gcm _git_commit
# Diff
__git_complete gdf _git_diff
__git_complete gdfc _git_diff
__git_complete gdfn _git_diff
__git_complete gdfw _git_diff
# Fetch
__git_complete gfe _git_fetch
# Log
__git_complete gl _git_log
__git_complete glf _git_log
__git_complete glo _git_log
__git_complete glr _git_log
# Merge
__git_complete gm _git_merge
# Pull
__git_complete gpl _git_pull
# Push
__git_complete gps _git_push
# Reset
__git_complete greh _git_reset
# Status
__git_complete gst _git_statusstatus
__git_complete gs _git_statusstatus
# エイリアス設定ココマデ
# ↓以下元々の行

# The following are necessary only for Cygwin, and only are needed
# when the user has tab-completed the executable name and consequently
# included the '.exe' suffix.

__git_complete 【エイリアス文字列】 _git_【コマンド名】 という形で設定する。ファイル内を検索すればコマンドごとの補完用の関数名が分かると思う。

参考