バージョン管理システム Mercurial を導入

[しゃべり担当] バージョン管理システム Mercurial を導入することにしたんだ。


[合いの手担当] 最近は git がよく話題にあがるね。


[しゃべり担当] しかし以下を見ると


Windowsでは Mercurialのほうが向いているようなんだね。


実際、Cygwinに gitが導入できないことがあった。バージョン管理システムラクをするためのものなのに、インストールが面倒では使わなくなってしまう。なるべく簡単に入れられるほうがいい。MercurialFreeBSD,Cygwinともラクにインストールできた。


あと実際に git使ってみたけどよく覚えられないだよね、コマンド名とか。
hgのほうが単語とか簡単だし、ほかのcvs,svnに概念が似ている。


[合いの手担当] hgって何?


[しゃべり担当] hg とはMercurialのコマンド名だよ。ソフト名が Mercurial で、コマンドを入力するときは hg。


[合いの手担当] 略になってないよww 略すなら mcr とかにするべきじゃないの。
Subversionsvnと略してるし、Bazaarは bzrだよ。


[しゃべり担当] MercuryとHydrogenは意味が同じ「水素」らしい。ならソフト名をHydrogenにすればいいようにも思うけどね元素記号がHgだから、この2つの単語は同じということらしい。まあ気にしなくていいよ。実際入力してみると、確かに hg は入力しやすくていい。


ただ、git, hg ともに日本語ファイル名の問題があるんだ。
日本語Windowsではファイル名をShift_JISで扱ってしまうので、「表.xls」とか「ソ.txt」とかを扱えないらしい。あと、Windowsで入れたファイル名をLinux(LANG=UTF-8)で取り出すと文字化けするらしい(Windowsで入れたのをWindowsで取り出すぶんには大丈夫)。
これらの問題はSubversion, Bazaarでは解決済みだそうだ。


[合いの手担当] じゃあ今からSubversionを使うのもありだね。

[しゃべり担当] でもSubversionはインストールも面倒(FreeBSDでは)だし、分散型じゃないから使うのが面倒だし、遅いからな。

分散型はネットワークにつながってなくても利用できるし、ローカルでデータ保存するので早い。


[合いの手担当] じゃあBazaarは?


[しゃべり担当] 遅いらしいし、文字コード関連もまだ完全ではないようだ。
【bzr】Bazaarでバージョン管理 Rev 2
http://logsoku.com/thread/hibari.2ch.net/tech/1265951333/482-


[合いの手担当] へえー、Macは「が.mp3」というファイル名を「か゛.mp3」と格納するのか。


[しゃべり担当] 日本語ファイル名は私も既に使ってるんだ。具体的には
http://ai11.net/2010/romakananico/teto/
とか。

これは UTAU音源がもととも「あ.wav」とかのファイル名だからそれをそのままコンバートしただけだが。
ただしFlash CS3(Flash Player 9)/Flex SDK 3でswf作成すると、文字コードとしてShift_JISの日本語ファイル名しか読まないんだ。Windowsだけじゃなく、Linux/FreeBSDサーバ上でも文字コードUTF-8では読み込まない。Shift_JIS文字コードでWebサーバにアップロードしないと動かないのさ。
だからファイル名を文字コード変換しないという git/hg の仕様は、実はこの場合ありがたい。svn/bzrが変換してUTF-8にすると動作しなくなるわけだから。


[合いの手担当] はあ。
でもその場合、ファイル名にはID番号振るだけにして、別のテキストでそのIDと かな文字 の対応表を記録したほうが安全だよ。

[しゃべり担当] そうだね。でも日本語ファイル名が一番わかりやすくて正確なんだけどね。「きぇ.mp3」を kixe.mp3 や kile.mp3 とか書きたくはないし。


バージョン管理システムの選択の話に戻ると、
基本的にこういうのは、大勢の人が使っているのに乗ったほうがラクできるんだ。バージョン管理システムはずっと長く使ってこそ意味が出てくるわけだし。
そういう意味で、MercurialGoogleさんがメインに採用しているのが大きい。


[合いの手担当] Git のほうがより将来安泰っぽくみえるけど、Mercurialもなかなかの安定ということですか。


[しゃべり担当] 私がインストールしたときの記録。

Windows XP への Mercurial インストール

http://sourceforge.jp/projects/gnupack/
で、gnupack (CygwinNTEmacsセット) を導入します。


そのあとCygwinbash

$ apt-cyg install python
$ apt-cyg install mercurial

これでOK。

FreeBSD 7.1 への Mercurial インストール

さくらのレンタルサーバ・スタンダードに入れます。

  1. FreeBSDのバージョン調査
    uname -a
  2. Portsの所在を確認
    http://www.freebsd.org/cgi/ports.cgi?query=mercurial&stype=all
  3. wget ftp://ftp.sakura.ad.jp/pub/FreeBSD/ports/i386/packages-7.3-release/python/mercurial-1.4.3.tbz
  4. pkg_add -P $HOME/local mercurial-1.4.3.tbz
  5. vi ~/.bashrc
    export PYTHONPATH=$PYTHONPATH:$HOME/local/lib/python2.6/site-packages を追加。
  6. vi ~/.hgrc で以下ファイルを作成。
[ui]
username = Itou Hiro <xxx@users.sourceforge.jp>
merge = emacs

[merge-tools]
emacs.args = --eval "(ediff-merge-with-ancestor \"$local\" \"$other\" \"$base\" nil \"$output\")"

チュートリアル Mercurial

以下の日本語チュートリアルを見て、学びました。
http://mercurial.selenic.com/wiki/JapaneseTutorial


mergeのところではまった。
FreeBSDマージプログラムには、コンソールで使えるEmacsを選びました。


Emacsのマージは、Ediffモードと Emergeモードがあるようです。どっちがいいのか‥。
以下のページによるとEdiffのほうが新しく、使い勝手もよいそうです。
http://www.math.s.chiba-u.ac.jp/~matsu/emacs/emacs21/ediff.html



この画面の「Type ? for help」と表示のあるBuffer、ここにカーソルを置いて操作します。
「?」を入力するとヘルプ表示。もう一度「?」でヘルプ消す。
「n」で次の差分位置に移動。「p」で前の位置に戻る。
差分位置に「n」などで移動して、ハイライトされた箇所で、上の2つのBufferの左がA、右がBなんですが、'A' Bufferの内容にしたいなら「A」、'B' Bufferがいいなら「B」を押す。
手作業で直すこともできるとさっきのEdiff紹介ページに書いてありますが、どうするんだろ。
作業終わったら「q」→y→y→yで保存され、差分編集Bufferが消えます。C-xC-cでEmacs終了。

日常的な手順

$ hg init myprojdir

または

$ mkdir myprojdir
$ cd myprojdir/
$ hg init

とすると、myprojdirディレクトリの下に .hgというディレクトリが作成されて、そこにMercurialデータが記録されるようです。

そのディレクトリはいつでも

$ hg clone myprojdir test1

としてコピーできるので、コピーしてからそっちでテストすれば hgの勉強がラクですね。


コミットするファイルをその myprojdirディレクトリに集めて、

$ hg st

すると、追加していないものは「?」つきで表示されます。

$ hg add

すると、追加されていないものは全部、コミット予定リストに「A」つきで表示され、次のコミットで追加されます。

$ hg remove a.jpg

すると、ファイルも消えて、コミット予定リストには「R」つきで表示されます。

$ hg mv a.jpg b.jpg

すると、ファイル名を変更。

$ hg commit -m "fix type"

すると、コミットします。


コミットメッセージを変えたいと思ったら、

$ hg rollback

でさっきのコミットをアンドゥ。(Mercurialではアンドゥは1回しかできない)
すぐに

$ hg commit -m "fix typo"

して再度コミットできました。

やべえデグレっちゃったよ、というときは前のバージョンとの差分をまず見ます。

$ hg tip

で最新バージョン、

$ hg log

で全バージョンの番号を見れるので、

$ hg diff -r10 -r11

で差分を見ます。


前のバージョンに戻すには hg revert
前のバージョンを取り出すには hg checkout

あとはブランチも学んでおきたい。




入門Mercurial Linux/Windows対応

入門Mercurial Linux/Windows対応

余談


ファイル変更管理システムを導入したいと考えていたんだけど、
音(wav,mp3)や画像(jpg,swfとか)などバイナリファイルをよく扱うため、どうせこれらはソース管理できないのでファイル変更管理システムは個人的には使わずにきました。

本日上書きして公開ファイルを開発中ファイルに書き換えてしまったりして、よしいい潮時だと
ファイル変更管理システムを導入、チュートリアルを実行。

仕事ではCVS,Subversion,Perforce,ClearCaseを使っていた。

  • Perforce,ClearCaseは有償なのとサーバ立てるのが大変そうなので候補から除外。
  • CVSFreeBSDで唯一最初から入ってるのはよいが、複数ファイルの扱いなどやりにくい。undoもない。
  • SubversionFreeBSDに最初からは入ってないし、インストールがめんどう。動作も遅い。分散開発の対応が不明。

CVS,Subversion,Perforce,ClearCaseは使ったことがあるんだけど、
その印象としては

CVS
各フォルダに「CVS」フォルダができて邪魔。使いにくい。
Subversion
Perforceに比べて動作が遅い。インストールが面倒(依存モジュールが多いので)。
Perforce
早いし使いやすいけど有償。中央管理サーバに常につながっていないと使えないのはマイナス。P4サーバをさくらのレンタルサーバに立てられるのか不明(たぶん無理)。ローカルWindowsサーバにするとルータに穴あけないと‥などサーバ管理が問題。
ClearCase
Windows専用っぽいしインストール面倒。遅い。しかも有償で高価。利点が不明。ブランチが図示されるのが一部には好評らしい。

最近はgitがよく話題にあがります。gitは動作も速いらしい。分散開発というのもいろんなPC,OSで開発している個人には便利そうだ。
しかし

を見ると、WindowsではMercurialのほうが向いているようです。
Flash開発なんてWindows上でやりますから、こっちがいいかな。
チェンジセットが番号なのもMercurialのほうがよさそうだ。

あと実際に git使ってみたけどよくわからないんだよね、コマンド形態が。
hgのほうが単語とか簡単だしほかのcvs,svnに似ている。

ファイル名に日本語使ってる(あ.mp3, い.mp3とか)のもあるので、そういうのはBazaarがよいようですが、基本的にこういうのは大勢が使っているのに乗ったほうがラクできます。
MercurialGoogleさんがメインに採用しているのが大きい。


Mercurialはソフト名(Mercurial)とコマンド名(hg)がちがうのが気にかかりましたが、ま いっか。Mercurialやってみますよ。
実はgitは、WindowsCygwinへのinstallがうまくいきませんでした。FreeBSDでは問題なかったですけど。
MercurialCygwin,FreeBSDでうまくインストールできたのでこっちにしました。

Windows XP

http://sourceforge.jp/projects/gnupack/
で、gnupack (CygwinNTEmacsセット) を導入します。


そのあとCygwinbash

$ apt-cyg install python
$ apt-cyg install mercurial

これでOK。

FreeBSD 7.1

さくらのレンタルサーバ・スタンダードに入れます。

  1. FreeBSDのバージョン調査
    uname -a
  2. Portsの所在を確認
    http://www.freebsd.org/cgi/ports.cgi?query=mercurial&stype=all
  3. wget ftp://ftp.sakura.ad.jp/pub/FreeBSD/ports/i386/packages-7.3-release/python/mercurial-1.4.3.tbz
  4. pkg_add -P $HOME/local mercurial-1.4.3.tbz
  5. vi ~/.bashrc
    export PYTHONPATH=$PYTHONPATH:$HOME/local/lib/python2.6/site-packages を追加。
  6. vi ~/.hgrc で以下ファイルを作成。
[ui]
username = Itou Hiro <xxx@users.sourceforge.jp>
merge = emacs

[merge-tools]
emacs.args = --eval "(ediff-merge-with-ancestor \"$local\" \"$other\" \"$base\" nil \"$output\")"

チュートリアル

以下の日本語チュートリアルを見て、学びました。
http://mercurial.selenic.com/wiki/JapaneseTutorial


mergeのところではまった。
FreeBSDマージプログラムには、コンソールで使えるEmacsを選びました。


Emacsのマージは、Ediffモードと Emergeモードがあるようです。どっちがいいのか‥。
以下のページによるとEdiffのほうが新しく、使い勝手もよいそうです。
http://www.math.s.chiba-u.ac.jp/~matsu/emacs/emacs21/ediff.html



この画面の「Type ? for help」と表示のあるBuffer、ここにカーソルを置いて操作します。
「?」を入力するとヘルプ表示。もう一度「?」でヘルプ消す。
「n」で次の差分位置に移動。「p」で前の位置に戻る。
差分位置に「n」などで移動して、ハイライトされた箇所で、上の2つのBufferの左がA、右がBなんですが、'A' Bufferの内容にしたいなら「A」、'B' Bufferがいいなら「B」を押す。
手作業で直すこともできるとさっきのEdiff紹介ページに書いてありますが、どうするんだろ。
作業終わったら「q」→y→y→yで保存され、差分編集Bufferが消えます。C-xC-cでEmacs終了。