リモートブランチを活用した使い方

セキュリティの問題から,サーバマシンには必要最低限の ソフトウェア以外はインストールしないことが多い。Webサーバに 置くWebコンテンツも,一般的にはWebサーバ上で編集するのではなく, 編集環境の整った別ホストで作成したものを,「安全な方法」で Webサーバにコピーする。安全な方法とはSSHのように暗号化通信路が 確保されるものを言う。Mercurialではリモートホストへのデータ転送に SSHを利用できるので,非常に安全なデータコピーが可能である。

手元のMercurialリポジトリを,リモートマシンにクローン化して置き, 手元の修正を送り込んで編集を進める方法を示す。

作業前提

編集環境のあるローカルマシン(pan)でWebコンテンツ作成を行ない, Webサーバ(qm2xx)に同一内容をコピーし,同期を取って行く流れとする。

+-------------+                   +-------------+
|    local    |                   |   remote    |
|             |                   |   server    |
|             |     hg push       |             |
|  [webdir/]  | ---------------→ |  [webdir/]  |
|   mercurial |                   |             |
|  repository |                   |             |
+-------------+                   +-------------+

リポジトリ操作

以下,ローカルマシン操作は「」のプロンプトで, リモートマシン操作は「」で表す。

作業は以下のような流れで進める。

  1. サーバ(リモート)側でWebコンテンツディレクトリを作成し, Mercurial リポジトリ化する(hg init; hg ci -A -m init)。
  2. ローカルで,サーバ側リポジトリのクローンを作る。
  3. ローカルでWebコンテンツを編集し,コミット。
  4. ローカルから修正をサーバに送り込む(hg push)。
  5. サーバ側で,送り込まれた修正をディレクトリ内容に反映する(hg up)。

これでローカルの作業ディレクトリをリモートに反映させる手段が 確保できるのでまずこの作業を行なう。ただし,この手順では

の面倒があるので続く設定作業でこれを解決する。

リポジトリとクローンの作成

まず,サーバ側で Mercurial を使う準備をする。サーバにログイン後, ホームディレクトリに .hgrc ファイルを以下のような内容で 作成する。

[ui]
username = KOEKI Taro <c123456@e.koeki-u.ac.jp>

実際には自分のローマ字氏名とメイルアドレスを入れる。

これができたらリモートサーバ側でWebコンテンツディレクトリを Mercurial リポジトリ化する。ここでは,サーバ側のコンテンツディレクトリを ~/webspace/ と仮定し,あらかじめその中に index.html を始めとしたいくつかのファイルが入っているものとする。

cd webspace
hg init; hg ci -A -m init

リポジトリを作成したら,そのクローンをローカル側に作成する。

hg clone ssh://qm2xx.is.koeki-u.ac.jp/webspace
ls                       (webspace/ を確認)

コンテンツ更新作業

手元でWebコンテンツを開いて編集してみる。ローカル側の webspace/index.html を開いて編集し,修正点をコミットする。

C-x C-f			ファイルを開く
C-x v v			コミット(ログ入力で C-c C-c)

この修正をサーバ側に送り込む。これには,

  1. ローカルのリポジトリ内でリモートに更新を押し込む(hg push)
  2. リモートのリポジトリ内で更新を反映させる(hg up)

の2つの手順を取る。

まずローカル側,リポジトリ内にcdしてから以下のように行なう。

cd webspace                # 必要なら
hg push

次にリモート側,同じくリポジトリ内にcdしてから以下のようにする。

cd webspace               # 必要なら
hg up

以後,ローカルでコンテンツ作成作業を行ない,更新点を全て コミットしたものを hg push でサーバ側に送り込めば,手元のディレクトリと サーバのディレクトリの同期が保たれる。

パスワード認証の手間軽減

公開鍵認証を用いたログインでは,パスフレーズをエージェントに 記憶させておいて自動的に秘密鍵を送らせることができる。

ssh-agentの起動

ssh-agentプログラムは,起動するとメモリ上に常駐し, 秘密鍵を覚えておいて認証で必要になったときに認証要求側に送り込んでくれる。 ssh-agentプログラムとの通信は環境変数 SSH_AUTH_SOCK に登録されたソケットファイル経由で行なわれる。そのため,ssh-agent プログラム起動時に設定された環境変数 SSH_AUTH_SOCK は 以下のいずれかでその後のプロセスに引き継がせる必要がある。

前者の場合はたとえば,~/.xinitrc の先頭と末尾に 以下の記述を行ない,X環境利用時の全てのプログラムでssh-agentと 通信できるようにする。

eval `ssh-agent`

……元々のファイルの内容……

ssh-agent -k

後者の場合はたとえば,screenを起動するときに

ssh-agent screen

などとすると起動した screen 内のシェルは全てssh-agentと通信できる 状態で起動する。

今回の作業ではX環境で動くEmacsからエージェントを使いたいので 前者の方法,つまり ~/.xinitrc の先頭・末尾に追加する。 追加が間違いなく終わったら一度ログアウトして入り直す(pan)。

ssh-agentへの鍵登録

以上いずれかの方法で ssh-agent を起動したら ssh-add コマンドを用いて秘密鍵を記憶させる。

ssh-add
Enter passphrase for /home/irhome/c110/ta01002/.ssh/id_rsa: 

このように聞いて来るので,秘密鍵のパスフレーズを入力する。 正しく記憶させられた場合は ssh -l で登録情報が出る。

ssh-add -l

ssh-add -L とすると,公開鍵が出力されるのでこれを リモート側の ~/.ssh/authorized_keys に保存する。

ssh -A qm2xx.is.koeki-u.ac.jp
ssh-add -L                   # 確認
mkdir -m 700 ~/.ssh          # ディレクトリ作成
ssh-add -L >> ~/.ssh/authorized_keys

これで次回のリモートホストへのログインでのパスフレーズ入力が 省略できる(実際にはエージェントが送っている)。

exit                         # いったん抜ける
ssh qmxx.is.koeki-u.ac.jp

パスフレーズ入力なしでログインできることが分かったら, Emacsで更新を送り込む実験をする。まず,ローカル側のリポジトリ内の .hg/hgrc ファイルを開き下線部の行を追加する。

[paths]
default = ssh://qm220.is.koeki-u.ac.jp/webspace
default-push = ssh://qm220.is.koeki-u.ac.jp/webspace

これは,元々ある default の行を default-push に置き換えたものである。 これができたら以下のように作業を進める。

  1. リポジトリ内のファイルを編集しコミット(C-x v v)する。
  2. hg pushする。ktermで行なう方法とEmacsからも行なう方法の両方が使える。
    ktermから「hg push」とコマンド起動
    EmacsからC-c h >

pushに成功すると以下のようなメッセージが出力される。

pushing to ssh://qm220.is.koeki-u.ac.jp/webspace
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 1 changesets with 1 changes to 1 files

(メッセージが日本語の場合もある)

リモート側のリポジトリ自動更新

Webコンテンツのように最新版への移行を気軽に行なえるものは, ローカルで hg push したときにリモート側のリポジトリで自動的に hg up するようなフックを仕掛けておくと作業が効率化される。

Mercurialのフックの設定

Mercurial リポジトリ内の .hg/hgrc ファイルには 様々なリポジトリ設定が記述できる。ここでは,リポジトリに対する なんらかのアクションをきっかけに自動的に起動する「フック」の設定を行なう。

リモート側にログインし,リポジトリとなるディレクトリに移動してから .hg/hgrc ファイルを開き以下の内容とする。

[hooks]
changegroup.up		= hg up >&2

ローカル側のEmacsに戻り,またWebコンテンツファイルを 編集・コミット・push してみる。

  1. ファイルを修正し C-x v v でコミット。
  2. C-c h > でpush

リモート側での更新が行なわれると,push成功時のメッセージに 以下のものが加わる。

0 files updated, 0 files merged, 0 files removed, 0 files unresolved
yuuji@koeki-u.ac.jp