Bash プロンプトに Git ブランチとステータスを表示する

Gitのコンテキストを瞬時に確認できるBashプロンプトのカスタマイズ

目次

適切に設定された bashプロンプトでgitリポジトリ情報を表示 は、開発ワークフローを大幅に改善することができます。

git status および git branch コマンドを常に実行する代わりに、この重要な情報をターミナルプロンプトに常に表示することが可能です。

oh-my-posh

oh-my-poshのプロンプト例。

なぜbashプロンプトにgit情報を追加するのか?

1日中複数のgitリポジトリやブランチを扱う場合、コンテキストスイッチングは生産性に大きな影響を与えます。gitを意識したプロンプトはいくつかの一般的な問題を解決します:

  • ブランチの混乱を防ぐ:コミットする前に常にどのブランチにいるかを把握できます
  • コマンドのオーバーヘッドを減らすgit status および git branch を常に実行する必要がありません
  • 即座の視覚フィードバック:未コミット変更、未追跡ファイル、アップストリームの状態を一目で確認できます
  • ミスを減らす:誤って間違ったブランチにコミットしたり、汚いコードをプッシュしたりするのを防ぎます

bash PS1変数の理解

bashプロンプトは PS1 環境変数によって制御されます。この変数には以下が含まれます:

  • リテラルテキスト:表示したい任意の文字
  • エスケープシーケンス\ で始まる特殊コードで動的な情報を表示
  • コマンド置換$(...) 内のコマンドを実行し、出力を表示
  • ANSIカラー コード:テキストの色を変更するエスケープシーケンス

一般的なPS1エスケープシーケンスには以下があります:

  • \u - 現在のユーザー名
  • \h - ホスト名
  • \w - 現在の作業ディレクトリ
  • \$ - ルートユーザーの #、通常ユーザーの $
  • \t - 24時間形式の現在時刻

基本的なプロンプトは以下のようになります:PS1='\u@\h:\w\$ ' で出力は user@hostname:/path/to/dir$ のようになります。bashの基本やエスケープシーケンスについて詳しく知りたい場合は、Bash Cheat Sheet をご確認ください。

方法1: gitの組み込みgit-prompt.shスクリプトを使用する

gitの配布には、__git_ps1 関数を提供する補助スクリプト git-prompt.sh が含まれています。これは最も信頼性が高く、機能が豊富なアプローチです。

git-prompt.shの場所の確認

まず、システム上にスクリプトがどこにあるかを確認してください:

# Linuxでの一般的な場所
/usr/share/git-core/contrib/completion/git-prompt.sh
/etc/bash_completion.d/git-prompt
/usr/lib/git-core/git-sh-prompt

# macOS(Homebrewを使用している場合)での一般的な場所
/usr/local/etc/bash_completion.d/git-prompt.sh
/Library/Developer/CommandLineTools/usr/share/git-core/git-prompt.sh

# 必要に応じて検索
find /usr -name git-prompt.sh 2>/dev/null

基本的な設定

~/.bashrc または ~/.bash_profile に以下の内容を追加してください:

# git-promptスクリプトをソース化
source /usr/lib/git-core/git-sh-prompt

# git情報を含むプロンプトを設定
PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\[\033[01;31m\]$(__git_ps1 " (%s)")\[\033[00m\]\$ '

$(__git_ps1 " (%s)") の部分は関数を呼び出しており、%s は現在のブランチ名に置き換えられます。囲むスペースと括弧で見やすく整形されています。

編集後、設定を再読み込みしてください:

source ~/.bashrc

git-prompt.shの高度なオプション

git-prompt.shは、環境変数を通じてオプションの機能を有効にすることで非常に強力になります:

# 変更が未スタージング(*)とスタージング(+)
export GIT_PS1_SHOWDIRTYSTATE=1

# スタッシュ変更が存在する場合に表示($)
export GIT_PS1_SHOWSTASHSTATE=1

# 未追跡ファイルが存在する場合に表示(%)
export GIT_PS1_SHOWUNTRACKEDFILES=1

# HEADとアップストリームの差異を表示
# オプション: auto, verbose, name, legacy, git, svn
export GIT_PS1_SHOWUPSTREAM="auto"

# 色付きヒントを有効(bash 4.0+が必要)
export GIT_PS1_SHOWCOLORHINTS=1

# 操作中のリポジトリ状態を表示
# (MERGING, REBASING, BISECTINGなど)
export GIT_PS1_DESCRIBE_STYLE="default"

ここに表示されるインジケーターの意味は以下の通りです:

  • * - 未スタージング変更(変更されたファイルが追加されていない)
  • + - スタージング変更(ファイルが追加されたがコミットされていない)
  • $ - スタッシュ変更が存在
  • % - 未追跡ファイルが存在
  • < - アップストリームブランチより後れ
  • > - アップストリームブランチより先
  • <> - アップストリームから分岐
  • = - アップストリームと同等

完全な設定例

以下の通り、~/.bashrc の完全な設定例です:

# git-promptをソース化
if [ -f /usr/share/git-core/contrib/completion/git-prompt.sh ]; then
    source /usr/share/git-core/contrib/completion/git-prompt.sh
fi

# git-promptのオプションを設定
export GIT_PS1_SHOWDIRTYSTATE=1
export GIT_PS1_SHOWSTASHSTATE=1
export GIT_PS1_SHOWUNTRACKEDFILES=1
export GIT_PS1_SHOWUPSTREAM="auto"
export GIT_PS1_SHOWCOLORHINTS=1

# 色の定義
COLOR_RESET='\[\033[00m\]'
COLOR_USER='\[\033[01;32m\]'      # 緑
COLOR_PATH='\[\033[01;34m\]'      # 青
COLOR_GIT='\[\033[01;33m\]'       # 黄

# プロンプトを設定
PS1="${COLOR_USER}\u@\h${COLOR_RESET}:${COLOR_PATH}\w${COLOR_GIT}"'$(__git_ps1 " (%s)")'"${COLOR_RESET}\$ "

方法2: 手動でgitコマンド置換を使用する

git-prompt.shにアクセスできない場合や、最小限の解決策が必要な場合は、プロンプト内で直接gitコマンドを実行できます:

# シンプルなブランチ名のみ
PS1='\u@\h:\w$(git branch 2>/dev/null | grep "^*" | colrm 1 2 | sed "s/^/ (/;s/$/)/")\$ '

# ブランチ名とステータスインジケーター
parse_git_dirty() {
    [[ $(git status 2> /dev/null | tail -n1) != "nothing to commit, working tree clean" ]] && echo "*"
}

parse_git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e "s/* \(.*\)/ (\1$(parse_git_dirty))/"
}

PS1='\u@\h:\w\[\033[01;33m\]$(parse_git_branch)\[\033[00m\]\$ '

このアプローチはよりポータブルですが、git-prompt.shに比べて洗練されておらず、大規模なリポジトリでは遅くなる可能性があります。

方法3: 現代的なプロンプトツールの使用

最小限の設定で豊富な体験を提供する現代的な代替手段は以下の通りです:

Starshipプロンプト

Starshipは、bash、zsh、fish、PowerShellなど複数のシェルで動作する高速でカスタマイズ可能なプロンプトで、Rustで書かれています。

# Starshipのインストール
curl -sS https://starship.rs/install.sh | sh

# ~/.bashrcに追加
eval "$(starship init bash)"

Starshipは自動的にgitリポジトリを検出し、以下を表示します:

  • ブランチ名
  • デタッチされた状態でのコミットハッシュ
  • リポジトリの状態(マージ、リベースなど)
  • 変更ファイルの数
  • アップストリームの前後状態
  • その他、カスタマイズ可能なアイコン付きで多くの情報

~/.config/starship.toml で構成します:

[git_branch]
symbol = "🌱 "
format = "on [$symbol$branch]($style) "

[git_status]
conflicted = "🏳"
ahead = "⇡${count}"
behind = "⇣${count}"
diverged = "⇕⇡${ahead_count}⇣${behind_count}"
untracked = "🤷"
stashed = "📦"
modified = "📝"
staged = '[++\($count\)](green)'
renamed = "👅"
deleted = "🗑"

Oh My Bash

Oh My Bashは、テーマとプラグインを使用してbash設定を管理するフレームワークです:

# Oh My Bashのインストール
bash -c "$(curl -fsSL https://raw.githubusercontent.com/ohmybash/oh-my-bash/master/tools/install.sh)"

# ~/.bashrcを編集してテーマを設定
OSH_THEME="powerline"

多くのOh My Bashテーマはデフォルトでgit統合が含まれています。

Oh My Posh

Oh My Posh は、bash、zsh、PowerShell、その他のシェルで動作する現代的な、クロスプラットフォームのプロンプトエンジンです。美しい、カスタマイズ可能なプロンプトを提供し、優れたgit統合とNerd Fontsを使用したアイコンサポートを提供します。

Linuxでのインストール

1つのコマンドでOh My Poshをインストールします:

# ~/binまたは~/.local/bin(デフォルト)にインストール
curl -s https://ohmyposh.dev/install.sh | bash -s

# またはカスタムインストールディレクトリを指定
curl -s https://ohmyposh.dev/install.sh | bash -s -- -d ~/bin

基本的な設定

~/.bashrc にOh My Poshを追加します:

# テーマで初期化
eval "$(oh-my-posh init bash --config ~/.poshthemes/jandedobbele耳.omp.json)"

テーマのインストールと使用

Oh My Poshには多くのプリインストールされたテーマが含まれています。まずそれらをダウンロードします:

# テーマディレクトリを作成
mkdir ~/.poshthemes

# すべてのテーマをダウンロード
curl -s https://ohmyposh.dev/themes.json | \
  jq -r '.[] | .url' | \
  xargs -I {} sh -c 'curl -s {} -o ~/.poshthemes/$(basename {})'

人気のあるテーマには以下があります:

  • jandedobbeleer.omp.json - 作成者の個人的なテーマで、フルgit統合が含まれています
  • powerline.omp.json - クラシックなpowerlineスタイル
  • atomic.omp.json - エッセンシャルな情報を含むミニマルスタイル
  • night-owl.omp.json - 色付きテーマで、詳細なgit情報が含まれています

テーマを変更するには構成パスを変更します:

eval "$(oh-my-posh init bash --config ~/.poshthemes/atomic.omp.json)"

gitの機能

Oh My Poshは自動的に包括的なgit情報を表示します:

  • 現在のブランチ名
  • リモートとの差分のコミット数
  • 作業中の状態(クリーン/汚い)
  • スタッシュ数
  • マージ/リベース状態
  • タグ情報
  • デタッチされたHEAD状態でのコミットハッシュ

カスタム構成

既存のテーマをコピーしてカスタムテーマを作成します:

# 既存のテーマをコピーして開始点として使用
cp ~/.poshthemes/jandedobbeleer.omp.json ~/.mytheme.omp.json

# テーマを編集
nano ~/.mytheme.omp.json

# カスタムテーマを使用
eval "$(oh-my-posh init bash --config ~/.mytheme.omp.json)"

gitセグメントの構成の例(JSON):

{
  "type": "git",
  "style": "powerline",
  "powerline_symbol": "",
  "foreground": "#193549",
  "background": "#fffb38",
  "background_templates": [
    "{{ if or (.Working.Changed) (.Staging.Changed) }}#FF9248{{ end }}",
    "{{ if and (gt .Ahead 0) (gt .Behind 0) }}#ff4500{{ end }}",
    "{{ if gt .Ahead 0 }}#B388FF{{ end }}",
    "{{ if gt .Behind 0 }}#B388FF{{ end }}"
  ],
  "properties": {
    "fetch_status": true,
    "fetch_upstream_icon": true,
    "branch_icon": " ",
    "branch_max_length": 25,
    "truncate_symbol": "…"
  }
}

フォントの要件

Oh My PoshはアイコンサポートのためにNerd Fontsを使用するのが最適です:

# Nerd Font(例: FiraCode)をダウンロードしてインストール
mkdir -p ~/.local/share/fonts
cd ~/.local/share/fonts
curl -fLo "FiraCode Nerd Font.ttf" \
  https://github.com/ryanoasis/nerd-fonts/raw/HEAD/patched-fonts/FiraCode/Regular/FiraCodeNerdFont-Regular.ttf
fc-cache -fv

その後、ターミナルでNerd Fontを使用するように設定してください。

Oh My Poshの利点

  • クロスプラットフォーム: Linux、macOS、Windowsで同じ設定が使用可能
  • 高速: Goで書かれておりパフォーマンスが良い
  • 拡張性: git、時間、パス、言語、クラウドプロバイダーなどのモジュラーレグメント
  • 豊富なテーマ: 大量のプリインストールテーマ
  • 活発な開発: 定期的な更新と改善
  • ターミナルに依存しない: 任意のANSI対応ターミナルで動作

Bash-git-prompt

git情報を専門に扱うbashプロンプトツールです:

# リポジトリをクローン
git clone https://github.com/magicmonty/bash-git-prompt.git ~/.bash-git-prompt --depth=1

# ~/.bashrcに追加
if [ -f "$HOME/.bash-git-prompt/gitprompt.sh" ]; then
    GIT_PROMPT_ONLY_IN_REPO=1
    source $HOME/.bash-git-prompt/gitprompt.sh
fi

大規模リポジトリでのパフォーマンスの考慮

git status操作は大規模リポジトリでは遅くなることがあります。最適化戦略は以下の通りです:

高価な機能を選択的に無効化

# .bashrcで大規模リポジトリに対して機能を無効化
if [ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = "true" ]; then
    repo_size=$(du -sh .git 2>/dev/null | cut -f1)
    # 100MBを超えるリポジトリでは汚い状態チェックを無効化
    if [[ "$repo_size" =~ ^[0-9]+M$ ]] && [ "${repo_size%M}" -gt 100 ]; then
        export GIT_PS1_SHOWDIRTYSTATE=0
    fi
fi

git構成オプションの使用

gitのステータスチェックを最適化するために構成してください:

# ファイルシステム監視を有効にしてステータスチェックを高速化
git config core.fsmonitor true
git config core.untrackedCache true

# 非常に大規模なリポジトリでは部分クローンを検討
git config core.commitGraph true
git config gc.writeCommitGraph true

代替案: 非同期プロンプト

Starshipなどのツールは非同期操作を使用してプロンプトのラグを防ぎます。git情報が取得された後でプロンプトが更新されます。

一般的な問題のトラブルシューティング

プロンプトがgit情報を表示しない

  1. git-prompt.shがソース化されているか確認: ターミナルで type __git_ps1 を実行してください。“not found"と表示される場合は、スクリプトが読み込まれていません。
  2. ファイルの権限を確認: git-prompt.shが読み取り可能か確認: ls -l /path/to/git-prompt.sh
  3. gitリポジトリ内であるか確認: git status を実行して確認してください
  4. PS1の構文を確認: $(__git_ps1) が含まれており、適切に引用されているか確認してください

色が表示されない

  1. エスケープシーケンスの問題: PS1の色は \[\] で囲まれる必要があります
  2. ターミナルのサポート: ANSI色をサポートしているか確認: echo -e "\033[31mRed Text\033[0m"
  3. リセットコード: すべての色シーケンスはリセットコード \033[00m で終わらせる必要があります

プロンプトが改行を破る

色を使用する際、非表示のエスケープシーケンスは \[\] で囲む必要があります:

# 間違った例 - 改行の問題を引き起こす
PS1="\033[32m\u\033[00m\$ "

# 正しい例
PS1="\[\033[32m\]\u\[\033[00m\]\$ "

WSLまたはネットワークドライブでの遅いプロンプト

Windowsネットワーク共有やWSLでのgit操作は遅くなることがあります:

# 遅いファイルシステムでの高価なgit-prompt機能を無効化
export GIT_PS1_SHOWDIRTYSTATE=0
export GIT_PS1_SHOWUNTRACKEDFILES=0

Windowsドライブにあるリポジトリに対しては、WSLではなくネイティブWindows Git bashを使用することを検討してください。

開発ワークフローとの統合

gitを意識したプロンプトは、他のシェルの強化と組み合わせてさらに強力になります:

gitのエイリアスによる迅速なナビゲーション

あなたの強化されたプロンプトと有用なgitエイリアスを組み合わせて、効率を最大化してください。gitコマンドとショートカットの包括的なリストについては、GITコマンドチートシート をご確認ください。

# ~/.gitconfigまたは~/.bashrcに追加
alias gs='git status'
alias gb='git branch'
alias gc='git checkout'
alias gp='git pull'
alias gpu='git push'

条件付きプロンプトの動作

# 違う状態でプロンプトの色を変更
__git_ps1_colorize() {
    local git_status="$(git status 2>/dev/null)"
    if [[ $git_status =~ "nothing to commit" ]]; then
        echo -e "\[\033[32m\]"  # 清潔な状態で緑色
    else
        echo -e "\[\033[31m\]"  # 汚い状態で赤色
    fi
}

PS1='\u@\h:\w$(__git_ps1_colorize)$(__git_ps1 " (%s)")\[\033[00m\]\$ '

ターミナルタイトルバーとの統合

リポジトリ情報をターミナルタイトルバーに更新します:

PROMPT_COMMAND='echo -ne "\033]0;${PWD##*/}$(__git_ps1 " [%s]")\007"'

最佳の実践と推奨事項

  1. 読みやすさを保つ: プロンプトに情報を過剰に詰め込まない
  2. 色を戦略的に使用: 異なる状態(清潔 vs 汚い)に異なる色を使用
  3. 複数のシナリオでテスト: 通常のディレクトリ、gitリポジトリ、git操作中でプロンプトが動作することを確認
  4. 構成を文書化: .bashrcにコメントを追加して、各部分が何をするかを覚えておく
  5. 構成をバックアップ: gitリポジトリにドットファイルをバージョン管理してください。独自のgitサーバーを運用している場合は、Giteaサーバーインストール を検討してください。軽量なセルフホストオプションです。
  6. ワークフローに応じて: 実際に必要な機能だけを有効にしてください
  7. 可能な限り現代的なツールを使用: Starshipや類似ツールはよくテストされており、パフォーマンスが良いです

セルフホストgitソリューションについては、Giteaバックアップと復元 について学んで、リポジトリが保護されていることを確認してください。gitワークフローを自動化したい場合は、GitHub Actionsチートシート をご確認ください。

有用なリンク

他の有用な記事