理工系研究者のための Mac OS X, Windows, Linux メモ
 
ホーム >> プログラミング >> Mercurial
このエントリーをはてなブックマークに追加

Mercurialの使い方

更新日:2014/4/22
  1. はじめに
  2. Pythonのインストール
    1. Python本体のインストール
    2. Docutilsのインストール
  3. Mercurialのインストール
    1. ユーザーディレクトリにインストール
  4. 文字コードの設定
  5. Apache HTTPDでMercurialのサーバーを立ち上げるための設定
    1. リポジトリを一覧を表示する
    2. hgwebdir.cgiを用いてリポジトリを一覧を表示する
    3. hgweb.cgiを用いてレポジトリを表示する
    4. pushできるように設定する
  6. Apacheの設定
  7. Mercurialを使う
    1. 設定
    2. 初期化
    3. proxyの設定
  8. SubversionのリポジトリをMercurialに変換する
  9. sshをつかってclone
  10. 無視するファイルの指定
  11. 設定ファイルhgrcについて
  12. リポジトリに追加または削除する
  13. リポジトリ間の差を調べる
  14. リポジトリの状態を表示する(hg status)
  15. クローン元のリモートリポジトリを調べる
  16. リビジョン番号を確認する
  17. フック
  18. コミットのユーザー名を変更する
  19. Q and A
    1. hg pushを実行したときにssl requiredというエラーが出るのですが?

はじめに

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

Pythonのインストール

Python本体のインストール

MercurialはPythonで書かれているのでPythonが必要。 インストールされていない場合は次の方法でインストールする。

Pythonは公式サイトからダウンロードできる。 ここではPython 2.6 系のPython 2.6.6を取得した。

コンパイルからインストールまでは次の通り。

$ tar zxvf Python-2.6.6.tgz 
$ cd Python-2.6.6/ 
$ ./configure 
$ make 
$ sudo make install

Pythonはデフォルトで /usr/local/ 以下にインストールされるので、 ~/.bash_profile

export PATH=/usr/local/bin:$PATH 
と書いてパスを通しておく。また、Pythonのライブラリ(モジュール)の位置を指定するためにPYTHONPATHも指定する。 これはMercurialのコンパイル時にMercurialのモジュールをインストールする場所を特定するために必要になる。
export PYTHONPATH=/usr/local/lib/python2.6/site-packages 

Docutilsのインストール

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

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

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

Mercurialのインストール

Mercurialのサイトからプログラムソースを取得する。 現時点(2013/7/7)での最新版はMercurial 2.6.3。 下記のようにインストールする。

$ wget http://mercurial.selenic.com/release/mercurial-2.6.3.tar.gz
$ tar zxvf mercurial-2.6.3.tar.gz
$ cd mercurial-2.6.3/
# python setup.py install
/usr/local/lib/python2.6/site-packages/ 以下にMercurialのモジュールが、/usr/local/binに実行ファイルhgがインストールされる。

ユーザーディレクトリにインストール

レンタルサーバ等,/usr/local/以下にインストールできない場合は,ユーザーディレクトリ以下にインストールすることができる。

$ mkdir ~/local
$ wget http://mercurial.selenic.com/release/mercurial-2.6.3.tar.gz
$ tar zxvf  mercurial-2.6.3.tar.gz
$ cd mercurial-2.6.3/
$ python setup.py install --home=~/local

文字コードの設定

Mercurialの文字コードを設定する。 設定するためには.bash_profileに環境変数を設定すればよい。

export HGENCODING=utf-8

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

Mercurialのソースを展開するとmercurial-*.*.*/にhgweb.cgiが含まれている。 このCGIスクリプトを用いるとブラウザからリポジトリを閲覧できるようになる。

以前はhgweb.cgiに加えて,hgwebdir.cgiが準備されていたが,現在ではhgweb.cgiに機能が統合されている。

リポジトリを一覧を表示する

hgweb.cgiをウェブサーバのCGIスクリプトが実行できるディレクトリに移動させる。例えば,
$ mv hgweb.cgi /usr/local/apache/htdocs/hoge/
とする。また,Mercurialのリポジトリが
/Users/apache/hg/REPO1/
/Users/apache/hg/REPO2/
...
だとする。

hgweb.cgiの修正箇所を赤字で示す。

#!/usr/bin/env python
#
# An example hgweb CGI script, edit as necessary
# See also http://mercurial.selenic.com/wiki/PublishingRepositories

# Path to repo or hgweb config to serve (see 'hg help hgweb')
config = "/Users/apache/hg/REPO1"
  #↑[1] リポジトリを直接指定,
#config = "/usr/local/apache/htdocs/hg/my_repo.config"
  #↑[1] または,リポジトリのリストを指定

# Uncomment and adjust if Mercurial is not installed system-wide
# (consult "installed modules" path from 'hg debuginstall'):
import sys; sys.path.insert(0, "/usr/local/lib64/python2.6/site-packages")
  #↑[2]

import os
os.environ["HGENCODING"]="UTF-8" #←[3]

# Uncomment to send python tracebacks to the browser if an error occurs:
#import cgitb; cgitb.enable()

from mercurial import demandimport; demandimport.enable()
from mercurial.hgweb import hgweb, wsgicgi
application = hgweb(config)
wsgicgi.launch(application)

[1]の箇所にはリポジトリのパスを書く。もし,リポジトリが複数あり,その一覧を表示させたい場合には,後述のconfigファイルを作成して,そのパスを書く。

[2]の箇所にはMercurialのライブラリがインストールされたライブラリまでのパスを書く。

[3]の箇所には文字コードを設定する。

リポジトリの位置を書くmy_repo.configには次のように記述する。

[paths]
my_repo_1 = /Users/apache/hg/REPO1
my_repo_2 = /Users/apache/hg/REPO2
「my_repo_1」の部分は任意の文字列。 ブラウザからhgweb.cgiにアクセスするとリポジトリの一覧が表示される。

pushできるように設定する

 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に変換する

hgsvnの開発版を取得する。

$ hg clone http://dev.pitrou.net:8000/hgsvn/devel hgsvn

Pythonのeasy_installを使ってインストールする。

$ sudo easy_install -s /opt/local/bin hgsvn
easy_installがインストールされていなければ、ここここを参考にインストールする。

なぜかhgpushsvnはインストールされないので手動でコピーする。

$ sudo cp hgsvn/hgpushsvn.py /opt/local/bin/hgpushsvn

htimportsvnコマンドを用いれば,Subversionのリポジトリから,hgリポジトリとしてデータを抜き出すことができる。

$ hgimportsvn http://example.jp/svnroot/repo

importした後,作業ファイルを取り出すにはpullする必要がある。

$ cd repo
$ hgpullsvn

Mercurialで行った変更をSubversionリポジトリに反映させることもできる。

$ hgpushsvn

▼参考サイト or 参考文献

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について

影響範囲ごとに次のような設定ファイルを利用できる。

個人用~/.hgrc
リポジトリ別repo/.hg/hgrc
全体/etc/mercurial/hgrc

設定ファイルには,例えば次のような設定を書くことができる。

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

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

リポジトリに追加または削除する

リポジトリにファイルを追加するには

hg add file
とする。すでに追加されているファイルをリポジトリから取り除くには、removeとforgetがありremoveはファイルをリポジトリから登録解除すると同時にファイルも削除する。一方で、forgetの場合はリポジトリから登録解除するがファイルは残したままとする。
hg remove file
hg forget file

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

自分の持っているリポジトリと別のリポジトリとの差を確認したい。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

フック

サーバ上のMercurialのリポジトリにpushされたときに,そのリポジトリをupdateしたいとする。 例えばウェブサイトのファイルをMercurialで管理している場合にはpushされるごとにupdateすれば最新版を表示できる。 このような目的にはhookを使う。

pushされるリポジトリの設定ファイル.hg/hgrcに次のように追記する。

[hooks]
incoming = /usr/local/bin/hg update
これでpushされる毎に,リポジトリ側で hg update が実行される。

▼参考サイト or 参考文献

コミットのユーザー名を変更する

Mercurialの機能拡張コマンドのconvertを使うとコミットの時に付けられたユーザー名を修正することができます。 convertコマンドを使うには,設定ファイルの~/.hgrcに次のように追記します。

[extensions]
hgext.convert=

ユーザー名を変更する前に,現在のリポジトリに登録されているユーザー名の一覧を作成したいと思います。 コミットlogが次のようは表示の場合,

changeset:   0:ec3309a3cca0
user:        Taro Yamada <taro@example.com>
date:        Mon Apr 21 17:22:55 2008 +0900
summary:     First commitment.
「user:」(言語環境によっては「ユーザ:」)が含まれる行を取り出して,その2列目以降の文字列のみ取得すれば良いのですが,これはhg loggrepawkをパイプで繋いで実現できます。 さらにsort, uniqコマンドで重複を覗くようにすれば,目的のユーザー名一覧が取得できます。
hg log | grep user: | awk '{$1=""; print}' | sort | uniq
Taro Yamada <taro@example.com>
Taro Yamada<taro@example.com>
Taro on home-PC
得られた文字列を使って,変換前後の文字列を等号(=)で結んだファイル(ファイル名authors.txt)を作成します。
Taro Yamada<taro@example.com>=Taro Yamada <taro@example.com>
Taro on home-PC=Taro Yamada <taro@example.com>

hg convertで変換前のリポジトリmyrepoと変換後のリポジトリmynewrepoを指定します。

hg convert --authormap authors.txt myrepo mynewrepo

▼参考サイト or 参考文献


Q and A

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

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

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

[web]
push_ssl = false
allow_push = *