理工系研究者のための Mac OS X, Windows, Linux メモ
 
ホーム >> プログラミング >> Mercurial

Mercurialの使い方

作成日:2008/6/5
更新日:2011/2/5
  1. はじめに
  2. インストール
  3. 文字コードの設定
  4. ApacheでMercurialのサーバーを立ち上げるための設定
  5. Apacheの設定
  6. Mercurialを使う
    • 設定
    • 初期化
    • Proxyの設定
  7. SubversionのリポジトリをMercurialに変換する
  8. sshをつかってclone
  9. 無視するファイル
  10. 設定ファイルhgrcについて
  11. リポジトリ間の差を調べる(hg outgoing)
  12. リポジトリの状態を表示する(hg status)
  13. クローン元のリモートリポジトリがどこだったのかを調べる(hg paths)
  14. リビジョン番号を確認する

Q and A

はじめに

Mercurialはバージョン管理のためのソフトウェア。分散型なのでリポジトリを自由に持ち運べるメリットがある。またLinux, Windows, Mac OS X など多くのOSに対応しているため、様々な環境で開発ができる。

Pythonのインストール

Python本体のインストール

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
を実行しておく。

Docutilsのインストール

Mercurial 1.7をコンパイルするときにDocuutilsが必要になる。このソフトウェアはPythonで書かれていて、インストールするとPythonのパッケージとしてインストールされる。

インストール方法 README.txt に書かれており、作業は次の通り。

$ tar zxvf docutils-snapshot.tgz
$ cd docutils/
$ sudo python setup.py install

Mercurialのインストール

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

ApacheでMercurialのサーバーを立ち上げるための設定

Mercurialのソースを展開するとmercurial-*.*.*/にhgweb.cgiとhgwebdir.cgiが含まれている。

リポジトリが複数ある場合に、hgwebdir.cgiを用いるとリポジトリ一覧を表示することができる。 また、リポジトリが一つだけの場合、またはリポジトリの一覧が必要ない場合にはリポジトリごとにhgweb.cgiを用いる。

hgwebdir.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を用いてレポジトリを表示する

リポジトリの一覧を表示せずに個別に扱いたい場合には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.cgi
Repo2についても同様にする。

次に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
に書けばよい。

Apacheの設定

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を使う

設定

Mercurialの個人の設定ファイルは ~/.hgrcになっている。

コミットするときに記入されるユーザー名を設定するには.hgrcに

[ui]
username = Taro Yamada <taro@example.jp>
のように書いておく。

また commitするときにコメントを書き込むために起動するエディタをEmacsとする場合には,同じく[ui]のところに

editor = emacs
と書いておく.

初期化

バージョン管理したいファイルをrepo1/に置いたとする。 バージョン管理を始めるには
 $ cd repo1
 $ hg init
とする。ディレクトリrepo1の中に.hgというディレクトリが作成される。

proxyの設定

proxyの設定は ~/.hgrc に
 [http_proxy]
 host = proxy.example.jp:8080
のようにサーバー名とポート番号を書いておく。

SubversionのリポジトリをMercurialに変換する

Pythonのモジュール管理システムに含まれるeasy_installというコマンドがインストールされていなければ、ここここを参考にインストールする。 hgsvnの開発版を取得する。
 $ 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/repo
pullしないと空のままなので、次のようにpullする。
 % cd repo
 % hgpullsvn
Mercurialで行った変更をSubversionに反映させることもできる。
 $ hgpushsvn
参考:ursmの日記

sshをつかってclone

sshでリモートログインできるならば、
 $ hg clone ssh://username@hostname//path/to/repo
のようにリポジトリを取得することができる。

無視するファイルの指定

リポジトリ内にMercurialで管理するファイル以外のものが含まれるとhg statusコマンドなどを実行した時に表示されてしまう. これを表示しないようにするためには.hgignoreに書いておけば良い.

全てのリポジトリに適用したい場合には,ホームディレクトリ直下に作成する.

 ~/.hgignore
特定のリポジトリに適用したい場合は,レポジトリのルート直下に作成する.
 repo/.hgignore

無視するファイルを,正規表現で表す場合には「syntax: re」,シェル形式で表す場合には「syntax: glob」をはじめに書いておく.

 syntax: glob 
 *.o 
 *.log 
 .hgignore
など。

設定ファイルhgrcについて

 [ui]
 username = Taro Yamada <taro@example.jp>  (名前)
 editor = emacs  (commit時に使うエディタ) 

 [web]
 description = My program  (リポジトリの名前,説明など)

リポジトリ間の差を調べる

自分の持っているリポジトリと別のリポジトリとの差を確認したい。hg pushによって送りつける内容を確認するには、
 $ hg outgoing(または hg out)
hg pullによって取り出す内容を確認するには
 $ hg incoming (または hg in)
とする。

リポジトリの状態を表示する(hg status)

リポジトリ内のファイルの変更状況を確認するには,hg statusコマンドを用います.

$ hg status

? test.html
! hoge.html
R fuga.txt
ファイル名の前に付く記号の意味は次の通りです.
記号意味
M更新されたファイル
Ahg addで追加されたファイル
Rhg removeで削除されたファイル
?管理されていないファイル
!管理されているにも関わらず見つからないファイル

クローン元のリモートリポジトリがどこだったのかを調べる

hg pushしたときにどこにpushされるのかを調べるには、
 hg paths

リビジョン番号を確認する

 hg identify -n

Q and A

hg pushを実行したときにssl requiredというエラーが出るのですが。

Mercurialではデフォルトでssl通信を使うようになっているので、 sshを使わずにhg push を実行するとssl requiredが出る事がある。

この場合には、リポジトリ内の設定ファイル repository/.hg/hgrc に次のように書き込む。(ファイルが無ければ作成する)

[web]
push_ssl = false
allow_push = *