| ホーム >> | プログラミング >> | Mercurial |
Mercurialはバージョン管理のためのソフトウェア。分散型なのでリポジトリを自由に持ち運べるメリットがある。またLinux, Windows, Mac OS X など多くのOSに対応しているため、様々な環境で開発ができる。
MercurialはPythonで書かれているので、あらかじめPythonをインストールする必要がある。 既にインストールされている場合にはそれを用いればよい。 Mercurialのインストールのときに指定するパスなどをそれぞれの環境に合わせて修正する必要がある。
Pythonは公式サイトからダウンロードできる。 ここではPython 2.6 系の最新版のPython 2.6.6を取得した。 インストーラ付きのバイナリではなくてソースを取得してコンパイルを行うことにする。
コンパイルからインストールまでは次の通り。
$ tar zxvf Python-2.6.2.tgz $ cd Python-2.6.2/ $ ./configure $ make $ sudo make install
Pythonはデフォルトで /usr/local/ 以下にインストールされるので、パスを通しておく。 ~/.bash_profileに
PATH=/usr/local/bin:$PATH exportと書けばよい。また、Pythonのライブラリ(モジュール)の位置を指定するためにPYTHONPATHも指定する。 これはMercurialのコンパイル時にMercurialのモジュールをインストールする場所を特定するために必要。
PYTHONPATH=/usr/local/lib/python2.6/site-packages export PYTHONPATH
.bash_profileに書いた場合には,書いた内容を反映させるために
$ source ~/.bash_profileを実行しておく。
Mercurial 1.7をコンパイルするときにDocuutilsが必要になる。このソフトウェアはPythonで書かれていて、インストールするとPythonのパッケージとしてインストールされる。
インストール方法 README.txt に書かれており、作業は次の通り。
$ tar zxvf docutils-snapshot.tgz $ cd docutils/ $ sudo python setup.py install
Mercurialのサイトからプログラムソースを取得する。 現時点(2011/2/5)での最新版はMercurial 1.7.5。 ここでは、Mac OS X用のパッケージを使わずにソースをコンパイルしてから、インストールすることにする。方法は次の通り。
$ tar zxvf mercurial-1.7.5.tar.gz $ cd mercurial-1.7.5/ $ make all $ sudo make install/usr/local/lib/python2.6/site-packages/ 以下にMercurialのモジュールが、/usr/local/binに実行ファイルhgがインストールされる。
Mercurialの文字コードを設定する。 設定するためには.bash_profileにおいて環境変数を設定すればよい。
HGENCODING=utf-8 export HGENCODING
Mercurialのソースを展開するとmercurial-*.*.*/にhgweb.cgiとhgwebdir.cgiが含まれている。
リポジトリが複数ある場合に、hgwebdir.cgiを用いるとリポジトリ一覧を表示することができる。 また、リポジトリが一つだけの場合、またはリポジトリの一覧が必要ない場合にはリポジトリごとにhgweb.cgiを用いる。
たとえば、リポジトリrepo1およびrepo2のあるディレクトリを
/home/apache2/hg/repo1 /home/apache2/hg/repo2だとする。
そしてCGIファイル(hgwebdir.cgi)を配置するディレクトリを
/usr/local/apache2/htdocs/hgとする。
hgwebdir.cgiをここにコピーする。パーミッションの変更し、実行権も付けておく。 必要ならファイル名を変更してもよい(例えばindex.cgiなど)。
$ cp hgwebdir.cgi /usr/local/apache2/htdocs/hg/ $ chmod 755 /usr/local/apache2/htdocs/hg/hgwebdir.cgi
hgwebdir.cgiを開いて、Mercurialをインストールしたディレクトリを指定する。変更は以下の部分。
# adjust python path if not a system-wide install: import sys sys.path.insert(0, "/usr/local/lib/python2.6/site-packages")同じく、メッセージなどのメタデータの文字コードをUTF-8にするために次のコメントアウトを外しておく(これを忘れるとメッセージが文字化けする)。
import os os.environ["HGENCODING"] = "UTF-8"hgwebdir.cgiの最後のあたりで設定ファイルが指定されている。
application = hgwebdir('hgweb.config')
同じディレクトリにhgweb.configというファイルを作成して、
[paths] MyRepo1 = /home/apache2/hg/repo1 MyRepo2 = /home/apache2/hg/repo2のように、適当につけたレポジトリの名前(MyRepo1)とそのディレクトリを指定する。 repo1のリポジトリからファイルを取得するには、
hg clone http://hg.example.jp/hg/hgwebdir.cgi/MyRepo1とする。
リポジトリの一覧を表示せずに個別に扱いたい場合にはhgweb.cgiを用いる。 まずウェブサイトにディレクトリを作成する。
$ mkdir /usr/local/apache2/htdocs/hg/MyRepo1 $ mkdir /usr/local/apache2/htdocs/hg/MyRepo2それぞれのディレクトリにhgweb.cgiをコピーする。実行権も付与しておく。
$ cp hgweb.cgi /usr/local/apache2/htdocs/hg/Repo1/ $ chmod 755 hgweb.cgiRepo2についても同様にする。
次にhgweb.cgiを開いて次のように編集する。
# adjust python path if not a system-wide install:
import sys
sys.path.insert(0, "/usr/local/lib/python2.6/site-packages")
import os
os.environ["HGENCODING"] = "UTF-8"
application = hgweb("/home/apache2/hg/repo1", "HogeRepo1")
wsgicgi.launch(application)
Repo2についても同様。
リポジトリからファイルを取得するには、
hg clone http://hg.example.jp/hg/repo1/hgweb.cgiとすればよい。
hg pushを用いて、更新を反映させるためには、サーバー側のレポジトリにおいてrepo1/.hg/hgrcというファイルを作成し、
[web] allow_push = * push_ssl = falseと記述する。 これでhttpでpush出来るようになる。 2行目のpush_sslは、デフォルトではsslを使って通信しようとするので、それをしないように(httpで通信するように)するため(参考)。 これらの設定を、すべてのレポジトリに適用したいなら、
/etc/mercurial/hgrcに書けばよい。
Hgのリポジトリをウェブで公開するためには、CGIスクリプトを実行できるように設定する必要がある。
httpd.confに次のように追記する。
<Directory "/usr/local/apache2/htdocs/hg"> DirectoryIndex index.cgi AddHandler cgi-script .cgi Options ExecCGI Order allow,deny Allow from all </Directory>apacheを再起動すれば設定完了。
/usr/local/apache/bin/apachectl restart必要ならば
/usr/local/apache2/htdocs/hg/.htaccessを用いてBasic認証を掛けておくとよい。
Mercurialの個人の設定ファイルは ~/.hgrcになっている。
コミットするときに記入されるユーザー名を設定するには.hgrcに
[ui]のように書いておく。
username = Taro Yamada <taro@example.jp>
また commitするときにコメントを書き込むために起動するエディタをEmacsとする場合には,同じく[ui]のところに
editor = emacsと書いておく.
$ cd repo1 $ hg initとする。ディレクトリrepo1の中に.hgというディレクトリが作成される。
[http_proxy] host = proxy.example.jp:8080のようにサーバー名とポート番号を書いておく。
$ hg clone http://dev.pitrou.net:8000/hgsvn/devel hgsvnインストールする。
$ sudo easy_install -s /opt/local/bin hgsvnなぜかhgpushsvnはインストールされないので手動でコピーする。
$ sudo cp hgsvn/hgpushsvn.py /opt/local/bin/hgpushsvnそして次のようにSubversionのリポジトリを取得することができる。
% hgimportsvn http://example.jp/svnroot/repopullしないと空のままなので、次のようにpullする。
% cd repo % hgpullsvnMercurialで行った変更をSubversionに反映させることもできる。
$ hgpushsvn参考:ursmの日記
$ hg clone ssh://username@hostname//path/to/repoのようにリポジトリを取得することができる。
リポジトリ内にMercurialで管理するファイル以外のものが含まれるとhg statusコマンドなどを実行した時に表示されてしまう. これを表示しないようにするためには.hgignoreに書いておけば良い.
全てのリポジトリに適用したい場合には,ホームディレクトリ直下に作成する.
~/.hgignore特定のリポジトリに適用したい場合は,レポジトリのルート直下に作成する.
repo/.hgignore
無視するファイルを,正規表現で表す場合には「syntax: re」,シェル形式で表す場合には「syntax: glob」をはじめに書いておく.
syntax: glob *.o *.log .hgignoreなど。
[ui] username = Taro Yamada <taro@example.jp> (名前) editor = emacs (commit時に使うエディタ) [web] description = My program (リポジトリの名前,説明など)
$ hg outgoing(または hg out)hg pullによって取り出す内容を確認するには
$ hg incoming (または hg in)とする。
リポジトリ内のファイルの変更状況を確認するには,hg statusコマンドを用います.
$ hg status ? test.html ! hoge.html R fuga.txtファイル名の前に付く記号の意味は次の通りです.
| 記号 | 意味 |
|---|---|
| M | 更新されたファイル |
| A | hg addで追加されたファイル |
| R | hg removeで削除されたファイル |
| ? | 管理されていないファイル |
| ! | 管理されているにも関わらず見つからないファイル |
hg paths
hg identify -n
Mercurialではデフォルトでssl通信を使うようになっているので、 sshを使わずにhg push を実行するとssl requiredが出る事がある。
この場合には、リポジトリ内の設定ファイル repository/.hg/hgrc に次のように書き込む。(ファイルが無ければ作成する)
[web] push_ssl = false allow_push = *