Bash で Git の状態を表示する方法

Bash で Git を使う際に、プロンプトにブランチ名やリポジトリの状態を表示できると便利です。 これにより、現在のリポジトリを把握しやすくなり、コマンドの実行ミスを防ぐのに役立ちます。

本記事では次のようにプロンプトに git の状態を表示する方法を解説します。

サンプル

目次

スクリプトの種類とおすすめ

Git の状態を表示するプロンプトのスクリプトには以下の2つがあります。

本件のスクリプトでもブランチやトラッキングの状態を把握するには十分です。

以下の手順では、本家のプロンプト用スクリプトの導入とカスタマイズ方法を解説していきます。

一時的に試す方法

まずはスクリプトをダウンロードしつつ、お試ししてみましょう。 以降のログイン以降でも有効にするための.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」に設定して、リポジトリ レベルでこれをオーバーライドします。

以上です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

システム開発の経歴が20年のエンジニアです。
フロントエンド(Ajax,...,React,SPA)からバックエンド(Database,...,Hadoop,PaaS)まで幅広く経験し、現在は企業に勤め、社内のITアーキテクトに就いています。

コメント

コメントする

CAPTCHA


目次