Bash で Git を使う際に、プロンプトにブランチ名やリポジトリの状態を表示できると便利です。 これにより、現在のリポジトリを把握しやすくなり、コマンドの実行ミスを防ぐのに役立ちます。
本記事では次のようにプロンプトに git の状態を表示する方法を解説します。
スクリプトの種類とおすすめ
Git の状態を表示するプロンプトのスクリプトには以下の2つがあります。
- git/git : 本家のスクリプトで間違いない
- magicmonty/bash-git-prompt: 本家より豊富な情報表示
本件のスクリプトでもブランチやトラッキングの状態を把握するには十分です。
以下の手順では、本家のプロンプト用スクリプトの導入とカスタマイズ方法を解説していきます。
一時的に試す方法
まずはスクリプトをダウンロードしつつ、お試ししてみましょう。
以降のログイン以降でも有効にするための.bashrc
への追記は後でやります。
ダウンロード
まず本家の git からスクリプトをダウンロードします。
curl -o ~/.git-prompt.sh https://raw.githubusercontent.com/git/git/refs/heads/master/contrib/completion/git-prompt.sh
スクリプトの読み込み
ダウンロードしたスクリプトを読み込みます。
. ~/.git-prompt.sh
プロンプトの変更
PS1
を変更して git-prompt
の結果を表示します。
$(__git_ps1 " (%s)"
が git の状態を表示する箇所です。
自分の好みの場所に埋め込みます。
PS1='\w $(__git_ps1 " (%s)")$ '
カスタマイズ
状態表示をカスタマイズします。
いくつかオプションがあり、 .git-prompt.sh
にコメントで動作が説明されています。
後半に日本語翻訳したものを記事の後半に残してあるので、参考にしてください。
GIT_PS1_SHOWDIRTYSTATE=yes
GIT_PS1_SHOWUNTRACKEDFILES=yes
GIT_PS1_SHOWSTASHSTATE=yes
GIT_PS1_SHOWUPSTREAM=auto
GIT_PS1_SHOWCONFLICTSTATE=yes
GIT_PS1_SHOWCOLORHINTS=yes
永続化する方法
次回以降のログインでも反映されるように .bashrc
への追記します。
# git-prompt
. ~/.git-prompt.sh
GIT_PS1_SHOWDIRTYSTATE=yes
GIT_PS1_SHOWUNTRACKEDFILES=yes
GIT_PS1_SHOWSTASHSTATE=yes
GIT_PS1_SHOWUPSTREAM=auto
GIT_PS1_SHOWCONFLICTSTATE=yes
GIT_PS1_SHOWCOLORHINTS=yes
# prompt
export PS1='\n\w $(__git_ps1 " [%s]")\n$ '
オプションの詳細
プロンプトに表示する git の状態は環境変数でカスタマイズできます。
.git-prompt.sh
にコメントで動作が説明されています。
英語だったので、日本語翻訳を載せておきます。
プロンプトについて
リポジトリのステータスは、現在 git リポジトリにいる場合にのみ表示されます。 %s トークンは、表示されるステータスのプレースホルダーです。
プロンプトのステータスには常に現在のブランチ名が含まれます。
ステージング(*,+): GIT_PS1_SHOWDIRTYSTATE
GIT_PS1_SHOWDIRTYSTATE を空ではない値に設定すると、ステージングされていない変更 (*) とステージングされた変更 (+) がブランチ名の横に表示されます。 この変数は bash.showDirtyState 変数を使用してリポジトリごとに設定できます。 GIT_PS1_SHOWDIRTYSTATE が有効になると、デフォルトで true になります。
スタッシュ($): GIT_PS1_SHOWSTASHSTATE
GIT_PS1_SHOWSTASHSTATE を空ではない値に設定することで、 現在何かが隠蔽されているかどうかを確認することもできます。 何かが隠されている場合は、ブランチ名の横に「$」が表示されます。
トラッキング(%): GIT_PS1_SHOWUNTRACKEDFILES
追跡されていないファイルがあるかどうかを確認したい場合は、GIT_PS1_SHOWUNTRACKEDFILES を空ではない値に設定します。 追跡されていないファイルがある場合は、ブランチ名の横に「%」が表示されます。 これは bash.showUntrackedFiles 変数を使用してリポジトリごとに構成できます。 GIT_PS1_SHOWUNTRACKEDFILES が有効になると、デフォルトで true になります。
アップストリーム(=,<>): GIT_PS1_SHOWUPSTREAM
HEAD とその上流の違いを確認したい場合は、GIT_PS1_SHOWUPSTREAM=”auto” を設定します。 「<」は遅れていることを示し、「>」は進んでいることを示し、「<>」は分岐していることを示し、「=」は差がないことを示します。 GIT_PS1_SHOWUPSTREAM をスペースで区切られた値のリストに設定することで、動作をさらに制御できます。
値 | 動作 |
---|---|
verbose | アップストリームの前/後ろ (+/-) のコミット数を表示 |
name | 冗長な場合は、アップストリームの略名も表示します |
legacy | git-rev-list の最近のバージョンで利用可能な「–count」オプションは使用しない |
git | 常に HEAD を @{upstream} と比較 |
svn | 常に HEAD を上流の SVN と比較 |
デフォルトでは、__git_ps1 は HEAD を上流の SVN と比較します (見つかった場合)。 そうでない場合は @{upstream} を比較します。 GIT_PS1_SHOWUPSTREAM を設定したら、bash.showUpstream 構成変数を設定することでリポジトリごとにオーバーライドできます。
ブランチと記号の区切り: GIT_PS1_STATESEPARATOR
GIT_PS1_STATESEPARATOR を設定することで、ブランチ名と上記の状態記号の間の区切り文字を変更できます。 デフォルトの区切り文字は SP です。
進行中の操作
マージ、リベース、元に戻す、チェリーピック、または二分化などの進行中の操作がある場合、プロンプトには操作に関連する情報が “|
リポジトリにスパース チェックアウトがある場合、「|SPARSE」形式の通知がプロンプトに含まれます。 これは単一の「?」に短縮できます。 GIT_PS1_COMPRESSSPARSESTATE を設定して文字を削除するか、 GIT_PS1_OMITSPARSESTATE を設定して省略します。
コンフリクト: GIT_PS1_SHOWCONFLICTSTATE
未解決の競合があるときにプロンプトに通知を表示したい場合は、 GIT_PS1_SHOWCONFLICTSTATE を「yes」に設定します。 プロンプトには「|CONFLICT」が含まれます。
デタッチ: GIT_PS1_DESCRIBE_STYLE
デタッチされた HEAD としてチェックアウトされたコミットの ID に関する詳細情報を確認したい場合は、 GIT_PS1_DESCRIBE_STYLE を次のいずれかの値に設定します。
値 | 動作 |
---|---|
contains | 新しい注釈付きタグ (v1.6.3.2~35) との相対関係 |
branch | 新しいタグまたはブランチに相対関係 (master~4) |
describe | 古い注釈付きタグ (v1.6.3.1-13-gdd42c2f) との相対関係 |
tag | 古いタグ (v1.6.3.1-13-gdd42c2f) との相対関係 |
default | 完全に一致するタグ |
カラーヒント: GIT_PS1_SHOWCOLORHINTS
現在のダーティな状態に関する色付きのヒントが必要な場合は、 GIT_PS1_SHOWCOLORHINTS を空ではない値に設定します。 色は、「git status -sb」の色付き出力に基づいています。
git ignored : GIT_PS1_HIDE_IF_PWD_IGNORED
現在のディレクトリが git によって無視されるように設定されている場合に __git_ps1 が何もしないようにしたい場合は、 GIT_PS1_HIDE_IF_PWD_IGNORED を空ではない値に設定します。 bash.hideIfPwdIgnored を「false」に設定して、リポジトリ レベルでこれをオーバーライドします。
以上です。
コメント