svnsync試してみた

svnsync は subversion repository の replication ツール。Subversion 1.4 から使える。よくバックアップって紹介されたりするけどバックアップと replication はなんか違うような気がする。RAID とバックアップが違うのと同じ感じかなぁ。

目的は忘れました

なんでこんなことをしようと思っていたか忘れました。なんかでも以下のようなことを考えていたような。

  1. Capistrano は rsync による deploy もできるけど repository から取ってくるのがやっぱ王道?
  2. でも普段の commit 作業はローカルのサーバの方が速いし快適だし
  3. svnsync 使えばいいの?

実際にやってみた

意外に準備が面倒。

  1. sync 先を svnadmin で作る
  2. sync 先の repository を手作業で sync 先として準備(後述)
  3. sync 先の repository を svnsync init DEST SRC で準備

※ sync 元の repository へは当然 read only アクセスしかできなくても問題ない。

ここまでくれば

svnsync sync

で ok.

2 の手作業っていうのは pre-revprop-change フックの作成のことで、素の repository を例に取るとこんな感じになる。

REPOSITORY/
|-- README.txt
|-- conf/
|-- db/
|-- format
|-- hooks/
|   |-- post-commit.tmpl
|   |-- post-lock.tmpl
|   |-- post-revprop-change.tmpl
|   |-- post-unlock.tmpl
|   |-- pre-commit.tmpl
|   |-- pre-lock.tmpl
|   |-- pre-revprop-change*      <-- これ
|   |-- pre-revprop-change.tmpl
|   |-- pre-unlock.tmpl
|   `-- start-commit.tmpl
`-- locks/

内容は

#! /bin/sh
exit 0

で、いいらしいんだけどこのことは残念ながら svnbook には書いてないんだよなー。hook がありさえすればいいっていうのはナゼか、とかも分からない。「そういうもの」として書かれていてなんか気持ち悪い。

一部だけsyncしてみた

あと、できるんじゃないかと思ったけど

  • 一部だけ sync もできる
    • svnなのでURLに詳細なパスを指定すればよいだけ
  • ただし revision は全部コピーされる
    • sync 対象以外の path は空 commit のような扱いになる(repository の db の中身を見るとすぐ分かる)

ということなので、でっかい repository を全部 replication しなくちゃいけないわけじゃないです。目的別に replica を作ってうまく使えるかも。

※ Subversion 1.5+ だと partial mirror は許可しないって書いてありました

忘れ物

自動化するには svn の repository の中の hooks の中の

post-commit

スクリプトに実行ビット立てて

svnsync sync URL

を叩いてやる必要があります。

More