最近、「git-completion.bash を使うと幸せになれるよ~!」という記事をいくつか見たので早速使ってみようと思ったのですが、それらの記事で説明されている方法は、パッケージシステムでインストールした git じゃなくてソースコードの tarball から git をインストールしたツワモノにしか通用しない方法だったりして、僕のようなパッケージシステムに頼りきっている軟弱者には使うことができませんでした。
試行錯誤の末、パッケージシステムを使って git をインストールした場合でも自動補完を使えるようになる方法がわかったので書き残しておきます。簡単ですよ!
なお、この手順は Cygwin で動作確認しましたが、ほかの環境でも同様の手順で可能だと思います。
ステップ 1. Cygwin の git-completion パッケージをインストール
- Cygwin 向けのパッケージでは、必要なファイルが git-completion パッケージに含まれていますのでこれをインストールします。
もちろんすでに導入済みであればこのステップを実行する必要はありません。
インストールするには、cyg-apt を使うか、Cygwin の setup.exe を実行します。
ちなみにこの記事を書いた時点で私の環境には、以下のようなバージョンの git-completion がインストールされていました。
$ cyg-apt version git-completion
1.6.1.2-1
ステップ 2. .bashrc を書き換えて、git の自動補完を有効にする
このステップには、実は 2 つの選択肢があります。
- A) git だけの自動補完を有効にする方法
- B) git だけでなく、インストールされているすべての自動補完を有効にしてしまう方法
どちらか好きなほうを選択して実行してください。
よくわからない場合は A) が無難なような気もしますが、B) のほうが作業がより簡単ですしほかのコマンドの補完も有効になるので便利といえば便利です。B) を選ぶことによる弊害はあまりないと思いますので B) でいいのではないでしょうか。
A) git の自動補完だけを有効にする
- /etc/bash_completion.d/git を適当な場所にコピーします。
例)
$ cp /etc/bash_completion.d/git ~/.git-completion.bash
- コピーしたスクリプトを取り込むための行を .bashrc に追加します。
例)
~/.bashrc
if [ -e "${HOME}/.git-completion.bash" ] ; then
source "${HOME}"/.git-completion.bash
fi
わざわざコピーしなくてもいいのでは・・・と思いますが、/etc/bash_completion.d/git の中を読むと、上記の方法が書かれています。
B) git だけでなく、すべての自動補完を有効にする
~/.bashrc を開くと、以下のような行がどこかにあるはずですので、コメントを解除して有効にします。
# case $- in
# *i*) [[ -f /etc/bash_completion ]] && . /etc/bash_completion ;;
# esac
↓
case $- in
*i*) [[ -f /etc/bash_completion ]] && . /etc/bash_completion ;;
esac
見つからない場合は、 同じような内容の行を自分で書き込みましょう。
これで自動補完が有効になるコマンドの一覧は、
$ ls /etc/bash_completion.d/
をすればわかると思います。
A), B), いずれの変更を行った場合も、最後に source ~/.bashrc を実行して、3. の変更の効果を取り込みます。
$ source ~/.bashrc
これで、プロンプトから git と入力したあとに TAB キーを 2 回押すと、サブコマンドが補完されるようになります。
$ git [TAB][TAB]
add clone init reset
am commit instaweb revert
annotate config log rm
apply describe merge send-email
archive diff mergetool shortlog
bisect fetch mv show
blame filter-branch name-rev show-branch
branch format-patch pull stage
bundle fsck push stash
checkout gc rebase status
cherry get-tar-commit-id relink submodule
cherry-pick grep remote svn
citool help repack tag
clean imap-send request-pull whatchanged
$ git
上に示したようなサブコマンドだけでなく、サブコマンドに指定するブランチ名やタグ名、長いオプション名(-- で始まるやつですね)などなど、いろんなものを補完してくれるようになるようです。
ちなみに、Ubuntu 9.10 では、git をパッケージでインストールしたあと特に何か設定を変えたりしたつもりはないのですが最初から自動補完が有効になってました。
git-core パッケージと一緒に /etc/bash_completion.d/git がインストールされており、さらにデフォルトの .bashrc で /etc/bash_completion を実行するようになっているようなので、最初から有効になっているのですね。(多分)
おまけ - プロンプトに git のブランチ名を表示させる方法
/etc/bash_completion.d/git の中では、__git_ps1 という関数が定義されていて、それを呼び出すと現在のブランチ名を含む文字列を取得することができます。
これを使って \$(__git_ps1) という文字列を環境変数 PS1 に組み込むと、めでたくプロンプトにブランチ名が表示されるようになります。
git のワークツリーの外にいるときは、__git_ps1 の結果は空文字列となりますので、プロンプトに表示するのに好都合です。(それで名前に ps1 と入っているのだと思います)
自動補完とはちょっと異なりますが、なんかおまけをもらったような得した気分になりますね。