2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at
  • 基本は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
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?