ファイル名にリビジョン番号を含めておいて、バックアップ時にリビジョン番号がその番号を超えていれば、バックアップをするしくみ。
【svnbackup.sh】
#!/bin/sh # バックアップ先ディレクトリ BACKUP_BASE_DIR=/mnt/sdb1/backups/svn # リポジトリベースディレクトリ SVN_BASE_DIR=/var/svn # リポジトリディレクトリ名リスト REPO_NAMES="InvestmentSimulator gameProjectFiles private tamu trac_ja" svn_backup() { TARGET_NAME=$1 if [ ! -d "${SVN_BASE_DIR}/${TARGET_NAME}" ]; then echo ${TARGET_NAME} は、存在しません。 return fi # 最新のリビジョンを取得 NEW_REV=`svnlook youngest ${SVN_BASE_DIR}/${TARGET_NAME}` # 前回バックアップ時のリビジョンを取得 LAST_REV=`get_last_revision ${TARGET_NAME}` if [ "${LAST_REV}" -ge "${NEW_REV}" ]; then # 現在のリビジョンが前回バックアップ時のリビジョン以下の場合 echo ${TARGET_NAME} は、前回バックアップ時と同じ状態です。 return fi sudo -u www-data svnadmin hotcopy ${SVN_BASE_DIR}/${TARGET_NAME} ${BACKUP_BASE_DIR}/${TARGET_NAME} (cd ${BACKUP_BASE_DIR}; tar zpcf ${TARGET_NAME}_${NEW_REV}.tar.gz ${TARGET_NAME}) rm -rf ${BACKUP_BASE_DIR}/${TARGET_NAME} echo ${TARGET_NAME} をバックアップしました。 } get_last_revision() { TARGET_NAME=$1 # 前回のバックアップファイル名を取得 LAST_BACKUP_FILENAME=`basename \`ls -1r ${BACKUP_BASE_DIR}/${TARGET_NAME}* 2>/dev/null | head -1\` 2>/dev/null` if [ -n "${LAST_BACKUP_FILENAME}" ]; then # 前回バックアップ時のリビジョンを取得 LAST_REV=`echo ${LAST_BACKUP_FILENAME} | sed -e "s/.*_\([0-9]\+\)\.tar\.gz/\1/"` echo ${LAST_REV} else echo "-1" fi } for reponame in ${REPO_NAMES} do svn_backup ${reponame} done