RSS2.0

Git 実行時にブランチとユーザー情報を表示してみる

最近になって、私が関係しているプロジェクトもだいたい Suvbersuin から Git に移行してきました。Git 自体は便利ですし、おもしろい機能もいっぱい詰まったとても魅力的なツールなのですが、Git を使う上ではいくつか気をつけなければならない点があります。

1 つは、自分が今どのローカルブランチにいるかを意識しなければならないことです。
Git では複数のブランチを切り替えて渡り歩くということが頻繁にあります。develop ブランチで開発していたけれど、少し大きめの実装をしなければならなくなると専用の別ブランチを切ってみたり、そこで日をまたぐと翌日には develop にいるものと思い込んで別ブランチで develop のコミットをしてしまったり、という失敗をたまにやってしまうのです。
もちろん、まず git branch を実行して確かめる習慣をもつことが重要ですが、いちいち git branch をタイプするのが何気に面倒なのです。

もう 1 つ、Git でコミットをする際のユーザー名とメールアドレスの設定忘れです。
Git でコミットするとコミットログに自動で user.name と user.email が追記されますが、これはリモートリポジトリからソースコードを取ってきた後自分で設定しなければなりません。git config に --global オプションを設定すれば設定値を共有できるそうですが、私は違うアカウントでいくつものリポジトリを自分のマシンに置いておくことが多く、それぞれのリポジトリで正しい名前でコミットされているかをいつも気にかけています。

ということで、より快適な Git ライフを手に入れるべく、git コマンド実行時にブランチ名やユーザー情報を表示するシェルスクリプトを書いてみました。
gitinfo.png

インストール

~/.bashrc に以下のように追記します。
function gitinfo() {
  GIT_COMMAND=`which -a git | grep -v "alias " | head -1`
  GIT_BRANCH=`${GIT_COMMAND} rev-parse --abbrev-ref HEAD 2> /dev/null`

  if [ $? = 128 ]; then
    return
  fi  

  GIT_USER=`${GIT_COMMAND} config --get user.name`
  GIT_MAIL=`${GIT_COMMAND} config --get user.email`
  GIT_VERSION=`${GIT_COMMAND} --version`

  GIT_MASK_USER_FROM=`${GIT_COMMAND} config --get gitinfo.usermask.from`
  if [ ${#GIT_MASK_USER_FROM} -gt 0 ]; then
    GIT_MASK_USER_TO=`${GIT_COMMAND} config --get gitinfo.usermask.to`
    GIT_USER=`echo ${GIT_USER} | sed -e s/${GIT_MASK_USER_FROM}/${GIT_MASK_USER_TO}/g`
  fi  

  GIT_MASK_MAIL_FROM=`${GIT_COMMAND} config --get gitinfo.mailmask.from`
  if [ ${#GIT_MASK_MAIL_FROM} -gt 0 ]; then
    GIT_MASK_MAIL_TO=`${GIT_COMMAND} config --get gitinfo.mailmask.to`
    GIT_MAIL=`echo ${GIT_MAIL} | sed -e s/${GIT_MASK_MAIL_FROM}/${GIT_MASK_MAIL_TO}/g`
  fi  

  MESSAGE="\e[1;34m${GIT_BRANCH} - ${GIT_USER} <${GIT_MAIL}> / ${GIT_VERSION}\e[m"

  echo -e ${MESSAGE}
}

alias git='gitinfo; git'

末尾の alias で、git コマンド実行前に gitinfo() を実行するようにしています。

gitinfo() は内部で git branch からブランチ名を、また git config から設定されているユーザー情報を取得し、画面に出力します。見やすさを考慮して、出力時には ANSI エスケープシーケンスで色付けもしています。

.bashrc はターミナル起動時に読み込まれるので、編集直後のみ source コマンドで変更内容を反映させてください。
$ source ~/.bashrc

これで冒頭のスクリーンショットのように、git コマンド実行時に現在のブランチ名とユーザー情報が表示されるようになります。

出力されるユーザー情報をマスクする

このシェルスクリプトで git コマンドを実行する度に追加情報が表示されるようになりますが、さすがに常にアカウント名が見えてしまうのは困ることがあります。外出先でコードに触る時などは、なるべく個人情報は画面に映したくありません。このシェルスクリプトには、ユーザー名やメールアドレスが特定の値だった場合にそれをマスクし、別の値を表示する機能が含まれています。

ユーザー名をマスクする場合には、git config コマンドで gitinfo.usermask.from と gitinfo.usermask.to を設定します。
$ git config gitinfo.usermask.from momokan
$ git config gitinfo.usermask.to adam
この設定をしたリポジトリでは、gitinfo() によって表示されるユーザー名が gitinfo.usermask.from の設定値だった場合に、かわりに gitinfo.usermask.to 設定値を表示するようになります。

同じように、ユーザーのメールアドレスをマスクするには gitinfo.mailmask.from と gitinfo.mailmask.to を設定してください。
$ git config gitinfo.mailmask.from momokan@chocolapod.sakura.ne.jp
$ git config gitinfo.mailmask.to adam@mail.com

マスクした結果がこちら。
$ git status
* develop - adam <adam@mail.com> / git version 1.7.11.7
# On branch develop
# Your branch is ahead of 'origin/develop' by 25 commits.
#
nothing to commit (working directory clean)
マスクされるのはあくまでシェルスクリプトによって表示される情報だけなので、コミットログにはマスクする前のユーザー情報が記載されます。

このマスクの設定は git config でローカルリポジトリに対して設定しているので、解除したい場合には git config --unset が有効です。
$ git config --unset gitinfo.usermask.from
$ git config --unset gitinfo.usermask.to

$ git config --unset gitinfo.mailmask.from
$ git config --unset gitinfo.mailmask.to
先ほど設定した gitinfo.usermask.from や gitinfo.mailmask.from を取り除けば、マスク機能は無効化されます。
  Linux  コメント (0)  2014/03/06 00:01:52


公開範囲:
プロフィール HN: ももかん
ゲーム作ったり雑談書いたり・・・していた時期が私にもありました。
カレンダー
<<2019, 9>>
1234567
891011121314
15161718192021
22232425262728
293012345