svn,git,hgコマンドのaliasあれこれ

バージョン管理システム使ってますか?
最近、会社のリポジトリSubversionからGitにがつがつ移行してます。Gitのブランチを使った Git Flowの考え方を浸透させるべく、反映ツールのGit対応などしております。


それと同時に、MyBikeJPプロジェクトは、Mercurialで管理を行っています。
微妙に似ているけど違う gitコマンドと hgコマンドに混乱しまくりで、先日、マージにミスって @key3 さんに迷惑かけちゃいました。


ということで、環境差異を吸収し、さらにミスが減って楽になるような aliasやシェル関数を設定しました。
ちなみに zshです。

Subversion

svnでは、元々、.zshrc を id:sotarok さんのをベースにしていた関係でショートカットを知りました。

http://trac.nequal.jp/browser/public/dotfiles/sotarok/zsh/.zshrc?PATH=$HOME/bin:/usr/gnu/bin:/opt/local/bin:/usr/local/bin:$PATH:/sbin#L128
久々に見たらまたバージョンあがったっぽい

たぶん参考にした当時はこんな感じだったと思います。

alias st='svn st'
alias stu='svn st -u'
alias sdi='svn di'
alias sad='svn add'
alias sp='svn up'
alias sup='svn up'
alias sci='svn ci'


さらにいくつか追加・変更して今はこんな感じ。

alias st='svn info; svn st'
alias stu='svn st -u'
alias stg='repos=`svn info|grep "URL: .*trunk"|sed "s/URL: \(.*\)trunk/\1/"`;list=`svn ls ${repos}tags`;echo -ne $list|grep "^release_"|sed "s/release_\(.*\)\//\1/"|sort -t . -k 1,1 -k 2,2n -k 3,3n|sed "s/\(.*\)/release_\1/";echo -ne $list|grep -v "^release_"|sort'
alias stl='stg'
alias sdi='svn di'
alias sad='svn add'
alias smv='svn mv'
alias srm='svn rm'
alias sp='svn up'
alias sup='svn up'
alias sci='svn ci'
  • st:今参照しているのがtrunkなのかブランチなのかがわかるように変更
  • stgsvnのタグ一覧を表示
    • 弊社では「release_1.2.3」のような命名規則のリリースタグを切るので、それをちゃんと並び替えて表示
  • smv, srm: 追加

Git

基本的には Subsersionの考え方を踏襲して省略コマンドを作成

alias gst='git status'
alias gtg='git tag'
alias gtl='list=`git tag`;echo -ne $list|grep "^release_"|sed "s/release_\(.*\)/\1/"|sort -t . -k 1,1 -k 2,2n -k 3,3n|sed "s/\(.*\)/release_\1/";echo -ne $list|grep -v "^release_"|sort'
alias gbl='git branch'
alias gbls='git remote prune origin;git branch -a'
alias gdi='git diff'
alias gad='git add'
alias gmv='git mv'
alias grm='git rm'
alias gci='git commit'
alias gcia='git commit -a'
alias gps='git push;git push --tags'
alias gpl='git pull;git pull --tag'
alias gmg='git pull origin'
alias gco='git checkout'
  • gtl:Gitでは、タグの概念がちょっと違うので、git tag と git tag -a 相当のコマンドを2つ用意
  • gbl、gbls:ブランチ用のコマンド用意 gblsはリモートも含めたブランチを表示
  • gps、gpl:pull pushはsvnには無い概念ですね
  • gmg:ブランチで作業中にmasterに入った新しい修正を取得するような時に使用
  • gco:作業ブランチの切り替え用

Mercurial

ブランチ作業中に defaultに入った修正を取り込む方法と、ブランチの切り替えが Gitと大きく違うところなのでそこらへんを考慮しました(先日のミスもこの辺)
あとは、差分確認や diffコマンドなどは、Gitの方が使いやすかったので、色を付けたりとか less風に確認とかは、そちらを真似してみました。

alias hst='echo -n "# On branch ";hg branch; hg --config "extensions.color=" status'
alias hbl='hg --config "extensions.color=" branch'
alias hbls='hg --config "extensions.color=" branches'
hdi() {
    hg --config "extensions.color=" diff --color=always $1 | less -R
}
alias had='hg add'
alias hrm='hg rm'
alias hci='hg commit'
alias hps='hg push'
alias hpl='hg pull;hg update'
alias hup='hg update'
alias hmg='hg merge -r'
hco() {
    hst
    FROM=`hg branch`
    TO=$1
    hg pull
    RET=`hg update -c -r $TO`
    if [ -n "$RET" ]; then
        hg --config "extensions.color=" update -r $TO
        hg --config "extensions.color=" diff -r $FROM --stat
    fi 
}
  • hdi:diffを色を付けて表示と同時に、ファイルを個別指定でも動くようにしたかったので、シェル関数として設定
  • hco:ブランチ切り替えの仕方が Gitと違って混乱するので新しいコマンド作成 切り替えた時にどのファイルが変更されたのかわからないのでわかるような機能を追加

作業している領域の確認

いま、どのブランチにいるのかというのがわからなくなってしまうので、常に見えるように設定

autoload -Uz vcs_info
zstyle ':vcs_info:*' formats '(%s)-%b '
zstyle ':vcs_info:*' actionformats '(%s)-%b|%a '
precmd () {
        psvar=()
            LANG=en_US.UTF-8 vcs_info
                [[ -n "$vcs_info_msg_0_" ]] && psvar[1]="$vcs_info_msg_0_"
}
RPROMPT="%1(v|%F{green}%1v%f|)[%~]"

入力しているコマンド行の右側に、リポジトリの種別、ブランチ名、今いるパス が表示されるようになりました。


こんな感じです。

dotfiles

こういう設定系は、新しいサーバに環境作る場合に同じものを反映できるように githubに放り込んであります。
https://github.com/marucc/dotfiles


ほかにも、このような設定を公開している人はたくさんいるので(このあたりとか> http://coderepos.org/share/browser/dotfiles/ )、いろいろ試してみるといいと思いますし、もっといい設定があったらぜひ教えてください。