はじめに
これまでWindows+tortoiseGitを使ってきたのだが、最近LinuxやMacでgitをCLIから使うことが多くなった。bashでgitを快適に使うために設定した項目をメモしておく。よく知られている設定だが、何でもアウトプットするのが大事とものの本で読んだので。
環境
Ubuntu 18.04
必要なスクリプトを探す
必要なのは、bashのプロンプトにリポジトリの情報を出力するためのgit-prompt.shと、コマンド補完をしてくれるgit-completion.bash。どちらもgitに同梱されているが、存在するディレクトリはgitのインストール方法によって違うらしいので、要検索。findコマンドは「許可がありません」の警告がうるさいので、/dev/nullにリダイレクトするとよい。
$ find / -name "git-prompt.sh" 2>/dev/null
/home/linuxbrew/.linuxbrew/etc/bash_completion.d/git-prompt.sh
/home/linuxbrew/.linuxbrew/Cellar/git/2.21.0/etc/bash_completion.d/git-prompt.sh
$ find / -name "git-completion.bash" 2>/dev/null
/home/linuxbrew/.linuxbrew/share/zsh/site-functions/git-completion.bash
/home/linuxbrew/.linuxbrew/etc/bash_completion.d/git-completion.bash
/home/linuxbrew/.linuxbrew/Cellar/git/2.21.0/share/zsh/site-functions/git-completion.bash
/home/linuxbrew/.linuxbrew/Cellar/git/2.21.0/etc/bash_completion.d/git-completion.bash
.bashrcの編集
source /home/linuxbrew/.linuxbrew/etc/bash_completion.d/git-completion.bash
source /home/linuxbrew/.linuxbrew/etc/bash_completion.d/git-prompt.sh
GIT_PS1_SHOWDIRTYSTATE=true # *:unstaged, +:staged
GIT_PS1_SHOWUNTRACKEDFILES=true # %:untracked
GIT_PS1_SHOWSTASHSTATE=true # $:stashed
GIT_PS1_SHOWUPSTREAM=auto # >:ahead, <:behind
GIT_PS1_STATESEPARATOR=':'
export PS1='\[\e[34m\]\W\[\e[0m\]\[\e[32m\]$(__git_ps1 " (%s)")\[\e[0m\] \$ '
プロンプトの出力は環境変数PS1
によって設定できる。現状の値をecho $PS1
で出力し、それをもとに設定するとよい。また、エスケープシーケンスによって様々な情報が出力できたり、色を付けたりできる。詳しくはこの記事などを参照のこと。考慮した情報は次のとおり。
- ホスト名
\h
:ターミナルのタイトルに表示されているので不要 - ユーザー
\u
:切り替えることが少ないので不要 - 現在のディレクトリ(フルパス)
\w
:欲しいが、深い階層になったとき、プロンプトの大部分が占められそう - 現在のディレクトリ(ベース)
\W
:上位階層まで表示してほしいタイミングがありそうだが、シンプルなので採用
コマンド__git_ps1
でリポジトリに関する情報(ブランチ名など)を出力できる。引数にフォーマットを指定できるので、括弧をつけるなりお好みで。また、各種変数を設定することで、リポジトリの状態を出力ができる:
-
GIT_PS1_SHOWDIRTYSTATE
: staged/unstaged fileの有無 -
GIT_PS1_SHOWUNTRACKEDFILES
: untracked fileの有無 -
GIT_PS1_SHOWSTASHSTATE
: stashの有無 -
GIT_PS1_SHOWUPSTREAM
: upstreamに対するahead/behind -
GIT_PS1_STATESEPARATOR
: ブランチ名と上記の情報とを区切る文字の指定。デフォルトは半角空白
詳細はgit-prompt.sh内の説明を参照のこと。特にGIT_PS1_SHOWUPSTREAM
が便利だと感じた。pullするタイミングを忘れないので。
おわりに
うっかりmasterブランチで作業しちゃった、みたいなことが少なくなった気がする。また、ブランチ名などの補完が聞くようになったおかげで効率が多少上がった気もする。