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'
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'
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/ )、いろいろ試してみるといいと思いますし、もっといい設定があったらぜひ教えてください。