Svn Post Commit Hook копировать зафиксированные файлы в рабочую копию для другого хранилища? - PullRequest
0 голосов
/ 10 апреля 2009

Цель состоит в том, чтобы поддерживать 2 отдельных репозитория, которые не имеют строго зеркального отображения. Оба хранилища могут быть обновлены разными разработчиками, поэтому о svnsynch не может быть и речи.

Подключение скрипта может быть не правильным решением, так как я бы предпочел запускать скрипт по желанию, а не с каждым коммитом. Возможно, скрипт для сравнения временных меток и копирования самого младшего? Пожалуйста, не рекомендуем нам переходить на git.

1 Ответ

1 голос
/ 10 апреля 2009

Я ссылаюсь на скрипт хука , который я использую, чтобы проверять часть хранилища каждый раз, когда это делается. Вы могли бы вероятно изменить это, чтобы удовлетворить Вашим потребностям; Я полагаю, вы захотите изменить svn checkout на svn export.

Для потомков я скопирую текст сценария сюда:

#!/bin/bash

# POST-COMMIT HOOK
#
# This is an SVN post-commit hook to automatically update a directory with the contents
# of some part of the SVN repository every time that part of the repository is changed.

fail() {
    echo "$@" 1>&2
    exit 1
}

# USER and PASS are the username and password of an SVN user with read access to the 
# relevant part of the repository
USER=""
PASS=""
# The root of the SVN repository
SVNROOT=""
# The path within the SVN repository to export whenever it's committed
SVNPATH=""
# The directory to hold the checked-out copy
WORKING=""

# Since environment variables are unset
export PATH="/bin:/usr/bin:/usr/local/bin"

getopt=$(which getopt)

TEMP=`$getopt -o u:p:U:P:d: --long user:,pass:,password:,svn-root:,svn-path:,working-dir: -n $0 -- "$@"`

if [ $? != 0 ]; then
    fail "Terminating...getopt failed"
fi

# Note the quotes around `$TEMP': they are essential!
eval set -- "$TEMP"

while true; do
    case "$1" in
        -u|--user)
            USER=$2
            shift 2;;
        -p|--pass|--password)
            PASS=$2
            shift 2;;
        -U|--svn-root)
            SVNROOT=$2
            shift 2;;
        -P|--svn-path)
            SVNPATH=$2
            shift 2;;
        -d|--working-dir)
            WORKING=$2
            shift 2;;
        --)
            shift
            break ;;
        *)
            fail "Option error!";;
    esac
done

test -n $SVNROOT || fail "Missing option --svn-root"
test -n $SVNPATH || fail "Missing option --svn-path"
test -n $WORKING || fail "Missing option --working-dir"

REPOS="$1"
REV="$2"

# The path to SVN executables
svnbin=$(which svn)
svnlook=$(which svnlook)
# The path to grep
grep=$(which egrep)

if test -n "$USER"; then
    AUTHSTR="--username $USER --password $PASS"
else
    AUTHSTR=""
fi
svnexport="$svnbin export --revision $REV $AUTHSTR"
svnupdate="$svnbin update --revision $REV $AUTHSTR"
svncheckout="$svnbin checkout --revision $REV $AUTHSTR"
svnchanged="$svnlook changed $REPOS --revision $REV"
grepq="$grep -q"

# If anything in the desired path has been changed
if $svnchanged | $grepq "^[A-Z]+[[:space:]]+$SVNPATH"; then
    # Check it out to the web root
    if test -d $WORKING/.svn; then
        $svnupdate $WORKING || fail "svnupdate failed"
    else
        $svncheckout file://$SVNROOT/$SVNPATH $WORKING || fail "svncheckout failed"
    fi
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...