- 基本はsvnadminのdump&load
- svndumpfilterでダンプするディレクトリの絞り込み
- sedでディレクトリの書き換え
書き換え後の親ディレクトリが存在しない場合は'svn mkdir'するためコピー先リポジトリに書き込み権限があるアカウントが必要。
repocopy.sh
# !/bin/sh
export LANG=
export LC_ALL=
export LC_CTYPE=
# リポジトリの場所
SVN_ROOT=/usr/local/svn
# svndumpfilterのオプション(適宜調整すること)
FILTER_OPT="--drop-empty-revs --renumber-revs"
if [ $# -ne 4 -a $# -ne 5 ]; then
echo 'Usage: $0 <user name> <src repo> <src dir> <dst repo> [dst dir]'
echo ''
echo '<user name>は<dst repo>の書き込み可能なアカウント'
echo '<src repo>内の[src dir]を<dst repo>にコピー'
echo '[dst dir]を指定した場合は[src dir]をリネーム'
echo ''
echo '※src dir/dst dir 共に"#"を含むパスは不可'
echo ''
exit 1
fi
username=$1
src_repo=$2
src_dir=$3
dst_repo=$4
if [ $# -ne 5 ]; then
dst_dir=$src_dir
else
dst_dir=$5
fi
# リポジトリの存在チェック
svnadmin lslocks $SVN_ROOT/$src_repo > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "リポジトリが見つかりません($src_repo)"
exit 2
fi
svnadmin lslocks $SVN_ROOT/$dst_repo > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "リポジトリが見つかりません($dst_repo)"
exit 3
fi
# コピー先のリポジトリに親ディレクトリを作成
dst_base=`dirname $dst_dir`
if [ "$dst_base" != "" ]; then
svn mkdir --parents -m "create base directory" --username $username svn://localhost/$dst_repo/$dst_base
fi
# dump -> filter -> change path -> load
svnadmin dump $SVN_ROOT/$src_repo | svndumpfilter include $FILTER_OPT "$src_dir" | sed -e "s#Node-path: $src_dir#Node-path: $dst_dir#" | svnadmin load $SVN_ROOT/$dst_repo