木曜日, 4月 10, 2008

svnsyncの使い方

svnsyncというのは、プログラムのソースコードなどを管理するバージョン管理システムSubversionのコマンドの一つです。ちょっと最近ハマったので調べた事をここにまとめてみます。

■svnsyncとは
svnsyncとは、Subversionのリポジトリを同期・複製するためのコマンドです。Subversion 1.4から追加されたらしい。リポジトリを同期・複製するための選択肢としては他にSVKというものがありますが、これはSubvesionには含まれずサードパーティ製ツールという扱いになります。主な違いは次のような感じです。

  • svnsync
    • Subversion 1.4以降に含まれる
    • 基本的に「ターゲットと同期する」ことしかできない。
  • SVK
    • サードパーティ製のツールである(Subversionのインストールには含まれていない)
    • Perlでできているらしい
    • svnsyncより出来る事は多い。特定のリビジョンをスキップしたり、特定のリビジョンまで同期するというようなオプションが用意されている。
    • 個人的な印象ですが、svnsyncほどの完成度ではない気がします(実際に今回ハマった部分はSVKでは回避できず、svnsyncでは回避できた)
■svnsync覚え書き
というわけでsvnsyncの覚え書きです。
  • 基本
    • リポジトリを作成する svn create hoge
    • 作成したリポジトリのフォルダを開き、hooks/pre-revprop-change.tmpl をコピーしてhooks/pre-revprop-change.bat に変更する(Windowsの場合)
    • hooks/pre-revprop-change.bat の2行目にexit 0 と記入する。
    • 作成したリポジトリに、複製元の情報をコピーする。svnsync init file://hoge http://target
      • これを実行すると、hogeのリビジョン0の属性として、次の3つの情報が書き込まれる。
      • svn:sync-from-uuid:複製元のリポジトリのuuid
        • 複製元リポジトリをsvn infoで見ると表示されるuuidと一緒のものが入力される。
      • svn:sync-last-merged-rev:同期した最終リビジョン
      • svn:sync-from-url:複製元リポジトリのパス (上記例ならhttp://target)
    • あとは同期をする。svnsync sync hoge
      • 基本的に最終リビジョンまで延々と処理を続ける。
    • これだけ。
  • メモ・調べたこと
    • sync-last-merged-rev、sync-from-urlなどを変更すればある程度svnsyncの状態をコントロールできます。ただし、sync-last-merged-revを変更した場合、リポジトリのリビジョンと不一致があると、syncを実施する際にエラーとなります。
    • sync-last-merged-revを変更するには、以下のコマンドを打ちます
      svn propedit svn:sync-last-merged-rev --revprop -r 0 --editor-cmd notepad file://hoge
    • もしもリビジョンを変更したら、それに合わせてリポジトリのリビジョンもインクリメントさせる必要があります。うまい方法が見つからなかったので、私はプログラム以外のテキストファイルをちょっとだけ修正してコミットして調整しました。
今回のハマリポイントは、移行元のリポジトリで破損したチェックインがある(おそらく文字コードの処理に失敗し、文字化けした変更がコミットされてしまっている)ため、どうしてもあるリビジョンの修正にアクセスできず、syncが出来ないというトラブルでした。このリビジョンにはいかなる方法でも(svn infoですら)アクセスできないため、これをすっ飛ばす事が必要というわけでした。

■参考資料
とにかくこれが一番だと思ってます。しょっちゅう開いています。

Subversion実践入門—達人プログラマに学ぶバージョン管理
Mike Mason
オーム社
売り上げランキング: 170542

他に今回の作業をするに当たっては、以下のページを参考にしました。

Blogged with the Flock Browser

0 件のコメント: