2015/08/05

svnrdump で uuid 取得できるね

今日は、実務の中でちょっとした発見ができたので、書き残しておくと思う。
世間にとっては既知なのかもしれないが・・・

日頃仕事でリポジトリ管理にオープン系の Svn と Git を扱っている。
Svnリポジトリの引っ越しやらバックアップやらで svnsync を使って同期状態にすることが多いが
「再配置(relocate)」が出来るようにするためには、リポジトリの UUID を同じにしておく必要がある。

svnsyncが出来るまでの基本手順
$ svnadmin create dest_repo_path
$ echo "#!/bin/sh" > dest_repo_path/hooks/pre-revprop-change
$ echo "exit 0" >> dest_repo_path/hooks/pre-revprop-change
$ chmod +x  dest_repo_path/hooks/pre-revprop-change
svnadminはローカルパスを指定する必要があるし、pre-revprop-changeファイル作成が必要
なので同期したいサーバー側で実行する必要があるかと思う。
実際の同期処理の、svnsync init と svnsync sync は、リモートから実行可能なので
アクセス可能なところから適当に。

本題はそこではなくて、再配置(relocate)可能な同期リポジトリにするためには先ほど書いたように
UUID を同じにしておく必要がある。

どうやって同期元リポジトリのUUIDを取得するか?

$ svnlook uuid src_repo_path とか
$ cat src_repo_path/db/uuid とか?

どちらにせよURLではなくファイルパス指定なので、

1.同期元リポジトリが存在するサーバー上で実行してコピペ?
2.NFSとかSambaとかsshfsとか使ってマウントしてuuidコピー?

手順のスクリプト化には厄介な話だ。自分はちょっと前まで実際に sshfs で元サーバーのリポジトリをマウントしてuuidコピーする手順をスクリプト化していた。苦肉の策。

すげー簡単な方法があった! やったーと思っているのは自分だけかも・・・
$ svnrdump dump -r 0 {src_repo_URL} | awk -e '/UUID/ { print $2 }' > uuid_file_path
これで取れる。しかも1ラインで。
svnrdump は、svndump をリモートから出来るようにしたコマンドなので、同期したい側から元リポジトリのURL指定でダンプが取れる。

ありがたいことに、どのリビジョンを取得してもダンプ情報の3行目に元のUUIDが記述されている。
UUIDを取り出したいだけなので、0番取得としている。Rev#0は属性情報だけなのでどんな
リポジトリでも一瞬でダンプが取れる。

取れさえすれば、直接uuidファイルに書き込んでもよし、svnadmin setuuid を使ってもよし。

ということで、チェックアウトせずにリモート操作で、しかも簡単にuuidを取得する方法でした。

0 件のコメント:

コメントを投稿