Alpine LinuxのBashでgit-prompt.shが有効にならない原因と対策

Alpine Linuxのシェルをbashにして正しい手順でgit-prompt.shを導入しPS1を設定しているのに、gitのリポジトリ中でブランチ名が表示されなくてお悩みの方向けの記事になります。

現象

リポジトリ中で以下のコマンドを実行しても空が返り、しばらくの間悩んでいました。

echo $(__git_ps1)

↑ブランチ名が返らず、シェルスクリプトのエラーも表示されません。

シェルスクリプトのエラーが表示されるなら導入に失敗していると思われますが、シェルスクリプト自体の実行は正常にされています。

原因

git-prompt.shの__git_ps1関数の先頭でset -xを実行するように変更して、git-prompt.shを読み込み直して実行してみました。

どうやら__git_eread ()の判定がおかしくて処理を中断している様子なので、読み込み権限のあるリポジトリ中で直接以下を実行してtestコマンドの動きを確認してみました。

test -r .git/HEAD ; echo $?
1

↑読み込み権限があるにもかかわらず、読み込み権限が無いという意味の返り値1が返ってきます。

これが直接の原因だったようです。

rに限らずwやxなど権限系のtestコマンドがことごとく判定に失敗している様子。

対策

Alpine Linuxのバージョンを変更

Alpine Linuxの3.13.7にするとtestコマンドの判定が正常に動くようになり、git-prompt.shの導入でgitリポジトリ中のブランチ名が正常に表示されるようになりました。

Alpine Linuxの3.14.2と3.14.3でも試しましたが、権限系のtestコマンドの判定がうまくいっておらずbusyboxやcoreutilsあたりをゴニョニョする必要がありそうなので3.14.x系での使用はあきらめました。

どうしても3.14.x系で手間をかけずにgit-prompt.shを動作させたい方は、次のgit-prompt.shの修正を参照してください。

3.15.x系では調査しておりません。

git-prompt.shの修正

Alpine Linuxのバージョン変更なんて簡単にできない状況の方も多いと思いますので、対処方法的なgit-prompt.shの修正を記しておきます。

以下のようにgit-prompt.shの__git_eread ()関数のtestコマンドの判定を修正します。

__git_eread ()
{
        test -f "$1" && IFS=$'\r\n' read "$2" <"$1"
}

test -rtest -f に変更

修正後、 git-prompt.shを読み込み直せばgitのリポジトリ中で正常にブランチ名が表示されると思います。

最後に

この記事が同じ状況でお悩みの方の問題解決につながれば幸いです。