svnsync は subversion repository の replication ツール。Subversion 1.4 から使える。よくバックアップって紹介されたりするけどバックアップと replication はなんか違うような気がする。RAID とバックアップが違うのと同じ感じかなぁ。
目的は忘れました
なんでこんなことをしようと思っていたか忘れました。なんかでも以下のようなことを考えていたような。
- Capistrano は rsync による deploy もできるけど repository から取ってくるのがやっぱ王道?
- でも普段の commit 作業はローカルのサーバの方が速いし快適だし
- svnsync 使えばいいの?
実際にやってみた
意外に準備が面倒。
- sync 先を svnadmin で作る
- sync 先の repository を手作業で sync 先として準備(後述)
- 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
を叩いてやる必要があります。