Chienomi

Git/Mercurialを使いデスクトップとラップトップで作業する

technique

  • TOP
  • Old Archives
  • Git/Mercurialを使いデスクトップとラップトップで作業する

GitやMercurialでの分散作業というのは、高度なユーザーやギークばかりでなく、多くの人にとってメリットのある手法だ。 デスクトップを母艦としてラップトップを使う人にとっては確実に意味のあることだろう。

基本的な話

まずいまいちど基本的な手法を確認しよう。 まず、基本となるリポジトリを作る。

Gitの場合

$ cd ~/Repositories/Myrepo.git
$ git init --bare
$ cd ~/Work
$ git clone ~/Repositories/Myrepo.git

Mercurialの場合yvarn

この違いは、Gitがワーキングツリーを持つリポジトリに対する同期を非推奨としていることによる。 そのため、同期するためにはベアリポジトリを作り、その上でワーキングリポジトリとしてcloneする必要があるのだ。

Mercurialの場合は特にそのような必要はなく、ワーキングツリーを持つリポジトリをcloneすれば分散作業できる。

ここでは話を楽にするためにMercurialを使おう。

デスクトップコンピュータのdragon.localホストの~/Work/Wyvarnリポジトリを作ったとする。 この作業を外で続けたくなったので、ラップトップ(knight.local)でこのリポジトリをcloneする。

$ cd ~/Work
$ hg clone ssh://jrh@dragon.local/Work/Wyvarn

Mercurialのsshアクセスはパス部が相対パスで始まっているものとみなすので注意してほしい。絶対パスで指定するためにはパス部を/ではじめる必要がある。

過酷な作業を終え、充実の成果をあげた。では家に帰ってその成果を反映しよう。

$ cd ~/Work/Wyvarn
$ hg push

続きはデスクトップで。デスクトップでリポジトリのアップデートを反映する。

$ cd ~/Work/Wyvarn
$ hg update

変更に強い構成にする

だが、実のところこのようなシステムではファイルの配置が変わったり、ファイル名が変わったり、ホスト名が変わったりするのはよくあることだ。 そのたびにすべてのリポジトリを修正するのはかなりの手間がかかる。

これにはふたつの抽象化レイヤーの導入が有効だ。

まずは、ホスト名を、そのホストに依存したものではなく、専用の固定名を与える。 ホストが少ないのであれば/etc/hostsファイルで良いだろう。

192.168.2.100          repo

多いのであれば、dnsmasqを使うと良い。

続いてリポジトリへのパスを抽象化しよう。 これは、次のようにするといい。

# mount --bind ~jrh/Repositories /mnt/repo

その上で

/home/jrh/Work/Wyvarn -> /home/jrh/Repositories/Wyvarn

のような状態にしておけばいいだろう(実体の位置を間違えないように)。

そして、ラップトップでは

$ hg clone ssh://jrh@repo//mnt/repo/Wyvarn

のようにすればいい。