リポジトリ配下のディレクトリを別のリポジトリへコピーするスクリプト

  • 2
    Like
  • 0
    Comment
More than 1 year has passed since last update.
  • 基本は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