Наше решение на сервере проектов быстрое и наколенное — в репозитарии настраивается post-commit hook, который создает пустой файл-флаг с именем проекта (имя проекта и папка, где лежит сам сайт одинаковы). По крону запускается скрипт, который считывает файлы-флаги из папки, детает cd /data/folder-with-sites/<project-name> и запускает svn update. Возможно данная система при большом количестве разработчиков потребует какой-либо блокировки, чтобы если предыдущий процесс апдейта затянется, то новый процесс не стартовал.
post-commit
#!/bin/sh
REPOS="$1"
REV="$2"
echo $1 $2 $3 $4 $5 > `echo $1 | sed 's/repos/repos\/.need-to-update/'`
(каталог svn-репозитария /data/svn/repos/<project-name>)
cron-script.sh
#!/bin/sh
dir=/data/svn/repos/.need-to-update/
for rep in `find $dir -type f`
do
web=`echo $rep | sed 's/svn\/repos\/.need-to-update/web/'`
subj=`echo $web | sed 's/\/data\/web\///'`
echo `date '+%Y-%m-%d %H:%M'` - $subj >>/root/scripts/post-commit-cron.log
cd $web
/usr/local/bin/svn --username <svn-user> --password <svn-user-passwd> --no-auth-cache update >>/root/scrip
/usr/local/bin/svn info >>rev.log
echo >>rev.log
/bin/chmod -R a+rwX ./
/usr/sbin/chown -R www:www ./
rm $rep
# echo ' ' | mail -s "U $subj" root
echo >>/root/scripts/post-commit-cron.log
done
(каталог с сайтом /data/web/<project-name>)