Subversionで、別リポジトリへディレクトリをコピーする方法

目的に応じて複数のSubversionリポジトリを使っていると、別のリポジトリへ作業ディレクトリをコピーしたくなる場合がある。そこで、プロパティ(svn:ignoreなど)の情報なども含めて、作業ディレクトリを別のリポジトリへコピーする方法を考えてみた。

※ 今までの履歴も含めて全てコピーした場合は、svnadmin dumpしたものにsvndumpfilterをかけて、移行先リポジトリにsvnadmin loadで取り込むのが良さそうだが、今回は、今までの履歴は捨てて最新のバージョンだけコピーする場合。
※ 単純にsvn exportしたものをsvn importすると、プロパティ(svn:ignoreやsvn:mime-typeなど)の情報がコピーできない。

やり方

bashで作業する。

Windowscygwin上で動作確認したが、多分Linux/BSD系でも動くと思う。
svn ls が1行目からファイル名一覧を、また、svn proplist が2行目以降からプロパティの一覧を表示すると仮定。

移行元リポジトリの作業ディレクトリ上で作業する

cd /home/user1/project1_src # 移行元の作業ディレクトリ(チェックアウト済)
export DEST_DIR=../project1_dest # 移行先の作業ディレクトリ
export DEST_URL=https://dest_subversionserver/trunk/project1 # 移行先のURL

移行先リポジトリの作業ディレクトリ(移行先ディレクトリ)を作成

まだ移行先をチェックアウトしてない場合のみ

mkdir $DEST_DIR
# svn mkdir $DEST_URL # 移行先のリポジトリパスをまだ作っていないなら
svn checkout $DEST_URL $DEST_DIR

移行先ディレクトリへ全てのファイルをコピー(svn:ignoreのものも)

find . -type d -not -path "*/.svn*" -print -exec mkdir "$DEST_DIR/{}" \;
find . -type f -not -path "*/.svn*" -print -exec cp "{}" "$DEST_DIR/{}" \;

移行先ディレクトリの対象ファイルを svn addする

export LANG=C
svn ls -R . | while read FILE; do svn add -N "$DEST_DIR/$FILE"; done

移行先ディレクトリへプロパティをコピーする

※ ./work.prop という一時ファイルをカレントディレクトリに作成します。

( echo ./ ; svn ls -R .  ) | while read FILE; do echo "$FILE"; svn -q proplist "$FILE" | sed -n -e "2,$ s/^ *\(.\+\)$/\1/p" | while read PROP; do svn propget "$PROP" "$FILE" > work.prop; svn propset -F work.prop "$PROP" "$DEST_DIR/$FILE"; done; done; rm work.prop

↑1行にコマンドを詰め込みすぎ(^-^;


あとは、移行先ディレクトリの内容を確認して、普通にコミットすればOK!