YAMAGUCHI::weblog

噛み付き地蔵に憧れて、この神の世界にやってきました。マドンナみたいな男の子、コッペです。

bashでgitとmercurialを使いやすくする

はじめに

こんにちは、Python界の渡辺篤史です。@nkjm宅にて記事を書いています。
(git-core 1.7.12以降で設定が変わるので、最新版を使う場合は最後の方を参照して下さい)

プロンプトにブランチ名を表示させよう

今のbashプロンプト

僕はzshを使おうと思いつつzshのdotファイルがどれに何を書けばいいのかわかりません状態が続いてずっとbashを使っています。いまのプロンプトはどこでも同じ色で表示されるように次のようなものを使っています。

PS1="\[\033[0;37m\][\[\033[0;32m\]\t \[\033[1;36m\]\u\[\033[0;37m\]@\h \[\033[0;32m\]\w\[\033[0;37m\
]]\n\$ "

こんな感じで表示されます。
f:id:ymotongpoo:20110115160719p:image

gitのブランチ名の取得

MacPortsでgitをインストールしていて、bash_completionを入れてなかった人は入れ直します。

$ sudo port install git-core +bash_completion

すると/opt/local/etc/bash-completion.d/gitが出来て、ここに補完用の設定が書かれています。Linuxなどで設定する場合には、$git_root/contrib/completion/git-completion.bashが同様のものです。
これを.bashrcで読み込むように設定しておきます。

export BASH_COMPLETION_DIR=/opt/local/etc/bash_completion.d
. $BASH_COMPLETION_DIR/git

こうしておくと $(__git_ps1 %s) でブランチ名を取得することが出来ます。

$ echo $(__git_ps1 %s)
master
mercurialのブランチ名の取得

mercurialの場合は自分でちゃちゃっと書いてしまいます。(ほんとはgitでもできるんだけど)hg branchでブランチ名を取得できるので、次のようにしてブランチ名を取得することにします。

hg_branch() {
    hg branch 2> /dev/null | awk '{print "(hg:" $1 ")"}'
}

これを書いておくと次のようになります。

$ hg_branch
(hg:default)
プロンプトの変更

最終的にはこのようになりました。

# prompt command
hg_branch() {
    hg branch 2> /dev/null | awk '{print "(hg:" $1 ")"}'
}

git_branch() {
    __git_ps1 '(git:%s)'
}

# setting for prompt
if [ -f $BASH_COMPLETION_DIR/git ]; then
    source $BASH_COMPLETION_DIR/git
    echo "git-completion enabled..."
    PS1="\[\033[0;37m\][\[\033[0;32m\]\t \[\033[1;36m\]\u\[\033[0;37m\]@\h \$(git_branch)\$(hg_branch) \[\033[0;32m\]\w\[\033[0;37m\]]\n\$ "
else
    PS1="\[\033[0;37m\][\[\033[0;32m\]\t \[\033[1;36m\]\u\[\033[0;37m\]@\h \[\033[0;32m\]\w\[\033[0;37m\]]\n\$ "
fi

export PS1

それぞれ、gitのレポジトリ、mercurialのレポジトリに移動すると次のようにブランチ名が表示されます。
f:id:ymotongpoo:20110115175833p:image
f:id:ymotongpoo:20110115175834p:image

bash補完を使う

さきほどgitに関してはbash_completion入れましたが、mercurialでも入れてしまいます。

$ sudo port install mercurial +bash_completion

.bashrcで、gitの時と同様に読み込んでおきます。

. $BASH_COMPLETION_DIR/mercurial

これで快適補完生活。

追記(2012/10/06)

@shibukawa から「gitのバージョンが上がって補完用のスクリプトのPATHが変わったよ」と教えてもらいました。

git-core 1.7.12だとこうすればよいようです。

hg_branch() {
    hg branch 2> /dev/null | awk '{print "(hg:" $1 ")"}'
}

git_branch() {
    __git_ps1 '(git:%s)'
}

# setting for prompt
if [ -f /opt/local/share/git-core/git-prompt.sh ]; then
   . /opt/local/share/git-core/git-prompt.sh
   echo "git-completion enabled..."
   PS1="\[\033[0;37m\][\[\033[0;32m\]\t \[\033[1;36m\]\u\[\033[0;37m\]@\h \$(git_branch)\$(hg_branch) \[\033[0;32m\]\w\[\033[0;37m\]]\n\$ "
else
   PS1="\[\033[0;37m\][\[\033[0;32m\]\t \[\033[1;36m\]\u\[\033[0;37m\]@\h \[\033[0;32m\]\w\[\033[0;37m\]]\n\$ "
fi

git-prompt.shを呼ぶように変更しています。