2018年以降の記事はGitHub Pagesに移行しました

Subversionで2ヶ所のリポジトリの同期を取るメモ

前提

差分のdumpとってload(失敗)

Aサーバ
  • 進んでいる分のダンプを取る。
    • rオプションでダンプを取るリビジョンを指定できる。一つだけだとそのリビジョンだけ。(222ならリビジョン222)範囲指定する場合はAAA:BBBとする
$ svnadmin dump リポジトリパス(/home/xxx/yyyなど) -r 111:222 --incremental > repo.dump
  • これをなんらかの方法でBサーバへ移動する(ftpでもUSBでも)
Bサーバ
  • svnadmin loadコマンドで差分ダンプファイルを流しこむ。
    • リビジョンがかぶっているとエラー(リビジョン111未満のもの)
$ svnadmin load リポジトリパス(/home/xxx/yyyなど) < repo.dump
<<< オリジナルのリビジョン 111 に基づき、新しいトランザクションを開始しました
     * パスを追加しています : trunk/xxx ...svnadmin: ファイルが既に存在します: ファイルシステム 'リポジトリパス', トランザクション xxx-xx, パス 'trunk/xxx'
    • 112からダンプしたファイルをloadする…とうまくいく予定だったのだが、なんかファイルのチェックサムが違うといわれた……。
$ svnadmin load リポジトリパス(/home/xxx/yyyなど) < repo.dump
<<< オリジナルのリビジョン 112 に基づき、新しいトランザクションを開始しました
     * パスを編集しています : trunk/xxx/a.sh ... 完了しました。

------- 新しいリビジョン xxx を (オリジナルのリビジョン xxx からロードして) コミットしました >>>

<<< オリジナルのリビジョン 113 に基づき、新しいトランザクションを開始しました
     * パスを編集しています : trunk/xxx/b.sh ... 完了しました。
     * パスを編集しています : trunk/xxx/c.sh ...
     svnadmin: ファイル '/trunk/xxx/c.sh' のチェックサムが一致しませんでした:
   期待:  f566e489511cea2fd1e6 ...
   実際:  0f76ab4f5d0625e9de9c ...

フルダンプをとる => 新しくリポジトリを作成 => loadでも同じファイル(リビジョンは違った)でコケたので別の方法を考える……。

hotcopy(成功)

このサブコマンドは、すべてのフック、設定ファイル、そしてもちろんデータベースファイルを含む、リポジトリの完全な「ホット」バックアップを作成します。

http://www.caldron.jp/~nabetaro/svn/svnbook-1.4-final/svn.ref.svnadmin.c.hotcopy.html

ただし可搬性に乏しいとの事。今回は同マシン、OS、Subversionバージョンなので大丈夫だと思う。まずAサーバでコピー。

$ svnadmin hotcopy リポジトリパス(/home/xxx/yyyなど) コピー先のリポジトリパス
a /home/xxx/yyy OK
a /home/xxx/yyy/hooks OK
a /home/xxx/yyy/hooks/start-commit.tmpl 3K
...
a /home/xxx/yyy/format 1K

これをBサーバへ持ってくるだけ。フルバックアップしかできないのでこれしか方法はない?

とりあえず一時しのぎはできたけど、チェックサム解消法も考えないといけないな。