gitの状態をターミナルに表示する

仕事ではgitを常用しているのですが、最近自分を含めてpushしていないとかbranchを間違えたとか色々問題が発生しています。
まあ、気をつけていれば良いだけなのですが人間はミスをする生き物なのでターミナルに表示するようにしておこうかと重い今日色々手探りで設定したのでメモしておきます。


環境はBashZshな人が最近は増えていますが、いまだにBashUnix系OSだと標準なので自分はZshにしていません。環境変わって不必要に使い辛く感じるのは嫌ですし。組み込みの仕事だとashが普通だったりするのでそれになれた体ですのでこれで十分です。
OSはMac用に作りましたが、Linuxでも動作しています。

formattedGitDiff() {
    ret=`git diff origin..HEAD --numstat 2>/dev/null`
    if [ "${#ret}" = 0 ]; then
        no_push=""
    else
        no_push="(!)"
    fi
    echo -e "$no_push"
}

formattedGitNoPush() {  
    ret=formattedGitDiff
    if [ "${#ret}" = 0 ]; then
        git fetch 2>&1 1>/dev/null
        ret=formattedGitDiff
    fi
    $ret
}


formattedGitBranch() {
    _branch=`git branch 2>/dev/null | grep '*' | tr -d ' *()'`
    _no_push=`formattedGitNoPush`
    test -n "$_branch" && echo -e "<$_branch$_no_push>"
}

formattedScreenNo() {
    test -n "$WINDOW" && echo -e ":$WINDOW"
}

PS1='$(formattedGitBranch)\[\033[01;34m\]\w\[\033[00m\]$(formattedScreenNo)\$ '


ひとまず、という表示にしています。また、リポジトリと差分があればと表示します。
formattedScreenNo()はscreenの番号を表示します。screenを使っていなければ表示しません。得に害は無いはずです。


追記:
formattedGitNoPush()を修正しました。


追記2:
git fetchはすでに変更がある状態ならば呼ばないようにしました。