はじめに

Git のバージョンアップ に合わせて git-completion.bash もアップデートしたら、g(git のエイリアス)で補完が効かなくなった。

g などのエイリアスに対しても補完を有効化する方法を忘れないようにまとめておく。(お察しの通り、過去の自分が有効化してたものを無効化してしまうという無能っぷり)

TL;DR

  • ~/.git-completion.bash の末尾に __git_complete g __git_main を追加する
  • ↑ でも良いが、また git-completion.bash をアップデートする時には絶対忘れている(確信)
  • ~/.git-completion.bash の読み込み後に処理を追加する方が良さそう(大抵は ~/.bashrc)
    • if [ -f ~/.git-completion.bash ]; then source ~/.git-completion.bash; __git_complete g __git_main; fi
      • ワンライナーで書いてるが、実際は複数行で書いて OK(後述)

目次

  1. はじめに
  2. TL;DR
  3. 環境・条件
  4. 詳細
    1. ~/.git-completion.bash を改造する方法
    2. .bashrc を改造する方法
  5. まとめ
  6. 参考文献

環境・条件

1
2
3
4
5
6
7
8
9
$ sw_vers 
ProductName: Mac OS X
ProductVersion: 10.14.6

$ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)

$ g --version
git version 2.23.0

詳細

~/.git-completion.bash を改造する方法

git commandのaliasを作ってる時でも補完して欲しい時 - Qiita に記載されているが、以下を ~/.git-completion.bash に追加すれば OK。

1
__git_complete <自分のエイリアス> __git_main

自分の場合は ggit のエイリアスにしているので、下記のようになる。

1
2
3
 __git_complete git __git_main
+__git_complete g __git_main
__git_complete gitk __gitk_main

あとはターミナルを立ち上げ直すなり、source ~/.bashrc なりすれば良い。

.bashrc を改造する方法

先程の方法でも良いが、また git-completion.bash がアップデートされると、補完のことを忘れていて上書きしてしまう可能性が高い。(というか間違いなくやる)やってることは定義した関数の呼び出しというだけなので、~/.bashrc で読み込んだ後であれば別ファイルで実行しても問題ない(はず)。

てなわけで、~/.bashrc を次のように変更した。git push とか git pull に対してもエイリアスを設定しているので、合わせて補完するように指定している。

1
2
3
4
5
6
7
 if [ -f ~/.git-completion.bash ]; then
source ~/.git-completion.bash
+ # Completion for aliases
+ __git_complete g __git_main
+ __git_complete gpl _git_pull
+ __git_complete gps _git_push
fi

これで git-completion.bash のアップデートを上書きしても、問題なく補完が動くはず。

まとめ

  • ~/.git-completion.bash の末尾に __git_complete g __git_main を追加する
  • ↑ でも良いが、また git-completion.bash をアップデートする時には絶対忘れている(確信)
  • ~/.git-completion.bash の読み込み後に処理を追加する方が良さそう(大抵は ~/.bashrc)
    • if [ -f ~/.git-completion.bash ]; then source ~/.git-completion.bash; __git_complete g __git_main; fi
      • ワンライナーで書いてるが、実際は複数行で書いて OK(後述)

参考文献

関連記事