UNIX/Subversion のバックアップ(No.5)


UNIX/Subversion

リポジトリ生成

svnadmin create --fs-type fsfs リポジトリディレクトリ


リポジトリ移行

 1.3リポジトリから1.4リポジトリ等

svnadmin dump リポジトリディレクトリ > リポジトリダンプファイル
svnadmin create --fs-type=fsfs リポジトリディレクトリ
svnadmin load リポジトリディレクトリ < リポジトリダンプファイル


環境設定

  • ディレクトリ作成
    mkdir /etc/subversion/conf/
    mkdir /etc/subversion/hooks/
    mkdir /etc/subversion/hook-scripts/

  • /etc/subversion/passwd.default
    複数リポジトリで共通で使用するpasswdファイルを用意する。
    [users]
    username1 = password1
    username2 = password2
    username3 = password3

  • /etc/subversion/conf/svnserve.conf
    passwd.defaultファイルを使用するように変更したsvnserve.conf。
    リポジトリ生成スクリプトでコピーする。
    realmも自動に設定できるように、置換用キーワードを埋め込んだ。
    [general]
    anon-access = none
    auth-access = write
    password-db = /etc/subversion/passwd.default
    realm = {REPOSITORY_NAME}

tagsへのコミット防止HOOKスクリプト

  • /etc/subversion/hooks/pre-commit
    pre-commit.tmplをsvnperms.pyを使用するように変更。
    また、リポジトリ生成スクリプトで使用するの置換用キーワードを埋め込んだ。
    #!/bin/sh
    
    REPOS="$1"
    TXN="$2"
    
    # Make sure that the log message contains some text.
    SVNLOOK=/usr/bin/svnlook
    $SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" > /dev/null
    if [ $? -ne 0 ]; then
      echo "error: There isn't comment." >&2
      exit 1
    fi
    
    /etc/subversion/hook-scripts/svnperms.py -r "$REPOS" -t "$TXN" -f {REPOSITORY_DIR}/conf/svnperms.conf -s tagrestrict || exit 1
    
    # All checks passed, so allow the commit.
    exit 0

  • /etc/subversion/hook-scripts/svnperms.py
    スクリプト本体。
    subversionをインストールしたらどこかにあると思われる。
    cp -p どこかのディレクトリ/svnperms.py /etc/subversion/hook-scripts/svnperms.py

  • /etc/subversion/conf/svnperms.conf
    svnperms用の設定ファイル。
    リポジトリ構成が/project-name/{trunk,tags,branches}の場合
    [tagrestrict]
    trunk/.* = *(add,remove,update)
    tags/[^/]+/ = *(add,remove)
    branches/[^/]+/.* = *(add,remove,update)
    リポジトリ構成が/{trunk,tags,branches}/project-nameの場合
    [tagrestrict]
    trunk/.* = *(add,remove,update)
    tags/.*/ = *(add,remove)
    branches/.* = *(add,remove,update)

リポジトリ生成スクリプト

  • svnrepcr.sh
    次の処理を行うスクリプトです。
    ・リポジトリ生成。
    ・trunk/tags/branchesのインポート。
    ・リポジトリディレクトリへ/etc/subversion/{conf,hooks}のキーワード置換とコピー。
    #!/bin/sh
    
    ### 引数チェック
    if [ "$1" = "" ]; then
      echo "usage : svnrepcr.sh [REPOSITORY-DIR]"
      echo
      echo "ex. svnrepcr.sh /var/data/svn/category/newrepository"
      exit 0
    fi
    REPOSITORY_DIR=$1
    
    
    
    ### 環境設定
    umask 0002
    ETC_DIR=/etc/subversion
    REPOSITORY_NAME=`basename ${REPOSITORY_DIR}`
    
    
    
    ### リポジトリ生成
    svnadmin create --fs-type=fsfs ${REPOSITORY_DIR}
    
    
    
    ### リポジトリ初期登録
    TEMP_DIR=`mktemp -d`
    mkdir ${TEMP_DIR}/trunk
    mkdir ${TEMP_DIR}/branches
    mkdir ${TEMP_DIR}/tags
    svn import ${TEMP_DIR} file://${REPOSITORY_DIR} -m "Initial import"
    rm -rf ${TEMP_DIR}
    
    
    
    ### リポジトリ環境設定
    cp ${ETC_DIR}/conf/* ${REPOSITORY_DIR}/conf/
    sed "s/{REPOSITORY_NAME}/${REPOSITORY_NAME}/" ${ETC_DIR}/conf/svnserve.conf > ${REPOSITORY_DIR}/conf/svnserve.conf
    sed "s:{REPOSITORY_DIR}:${REPOSITORY_DIR}:" ${ETC_DIR}/hooks/pre-commit > ${REPOSITORY_DIR}/hooks/pre-commit
    chmod +x ${REPOSITORY_DIR}/hooks/pre-commit
    
    
    
    echo "create repository done."

関連ページ