名を名乗れ!

Git の入門書には,大抵,まず自分の名前を設定しましょうと書いてあります. たとえば,Pro Git Git - First-Time Git Setup でも.

$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com

これ,設定してて困ったことありませんか? というのが今日の話です.

よく忘れるリポジトリ毎の名前変更

僕は,リポジトリ毎にメールアドレスを変えたいことがよくあります.そんなときは, --global を付けずに:

$ cd private-project
$ git config user.email private@example.com

とすれば,そのリポジトリだけの local な設定として private@example.com が優先されます.ここまでは常識ですね.

ただ,これをよく忘れるんです.忘れると global な名前で commit message が残ってしまって,それに気付かずに push して面倒なことになります. なので,僕は,global な user.email を設定していません.

では,global な設定をしないで,local な設定も忘れてしまうとどうなるでしょう. 望まないメールアドレスが外に出て行く心配はないのですが, git が適当に自動で付けた名前と email アドレスで commit message が残ります. これは,場合によっては,もっと恥ずかしいかもしれません.

なので,git は,push して恥ずかしい思いをする前に警告してくれます:

$ git commit -m 'First import'

Your name and email address were configured automatically based
on your username and hostname. Please check that they are accurate.
You can suppress this message by setting them explicitly:

    git config --global user.name "Your Name"
    git config --global user.email you@example.com

After doing this, you may fix the identity used for this commit with:

    git commit --amend --reset-author

かしこいですね.

でもね,できれば Commit する前に教えてよ…

でも,できれば commit する前に教えて欲しい. pre-commit hook を設定すればいい気がしますが,そもそもこれを設定するのを忘れる… そこで,zsh のプロンプトに出すことにしました.

~/.zshrc より抜粋:

##
## VCS and RVM info in prompt.
##

# http://qiita.com/items/8d5a627d773758dd8078
+vi-check-git-repository-info() {
    local email="$(git config --local --get user.email |cut -d. -f 1)"

    if [[ "$1" = 0 ]]; then
        if [[ -n "$email" ]]; then
            hook_com[misc]+=":$email"
        else
            hook_com[misc]=""
        fi
    fi

    if [[ "$1" = 1 ]]; then
        if [[ -z "$email" ]]; then
            hook_com[misc]+="- WHO ARE YOU? - "
        else
            hook_com[misc]=""
        fi
    fi
}

if zsh-is-at-least 4.3.11 ; then
    autoload -Uz vcs_info
    zstyle ':vcs_info:*' formats '(%s%m)-[%b]' '%m'
    zstyle ':vcs_info:*' actionformats '(%s)-[%b|%a]'
    zstyle ':vcs_info:git+set-message:*' hooks check-git-repository-info
    precmd () {
        rvm_prompt=`~/.rvm/bin/rvm-prompt`
        psvar=()
        LANG=en_US.UTF-8 vcs_info
        [[ -n "$vcs_info_msg_1_" ]] && psvar[1]="$vcs_info_msg_1_"
        [[ -n "$vcs_info_msg_0_" ]] && psvar[2]="$vcs_info_msg_0_"
        [[ -n "$rvm_prompt"      ]] && psvar[3]="[$rvm_prompt]"
    }
    RPROMPT="%1(v|%F{red}%1v%f|)%2(v|%F{green}%2v%f|)%3(v|%F{yellow}%3v%f|)"
fi

この設定で,email を設定していないと,- WHO ARE YOU? - と聞かれるようになります.

git-prompt-who-are-you.png
Figure 1: ローカルな emai が設定されていないとき
git-prompt-with-your-email.png
Figure 2: ローカルな emai が設定されているとき

となります.プロンプト右端は,rvm の情報なので,今回の話とは関係ありません.

あと,WHO ARE YOU と聞かれたときに簡単に返答できるようなエイリアスを作っています.

~/.gitconfig:

[alias]
        email-github = config user.email github-username@example.com
        email-work   = config user.email work-username@example.com

SPAM 対策で複数のメールアドレスを使い分けている人にも有効かもしれません.