Если критично не давать ssh (хотя и при его наличии схема та же, просто инициатор деплоя - не сервер), я бы сделал так.
svn up на веб сайте - нехорошо, ибо неатомарно (некоторое время будет присутсвовать неконсистентный код); класть веб сервер на время обновления мы вряд ли хотим (если хотим - то это все не нужно конечно

).
Структура (префиксы на усмотрение, пусть будет /var/www/site.ru):
/var/www/site.ru/
/var/www/site.ru/234
/var/www/site.ru/236
/var/www/site.ru/255
/var/www/site.ru/current -> симлинк на последнюю /var/www/site.ru/255
Конфиги веб сервера при этом указывают в current.
Скрипт (скажем, вебморда с кнопкой deploy):
1) смотрим текущий номер ревизии - пусть он равен 260
2) делаем svn export в /var/www/site.ru/260
3) меняем симлинк current -> 260
4) делаем apachectl reload (или там php-fpm reload, что там стоит).
При этом храним последние N (например 3) предыдущие, чтобы на случай, если обнаружилось, что после выкатки ничего не работает, можно было срочно откатиться назад (в той же морде выбор из списка предыдущих ревизий и кнопочка "откатиться" - меняет симлинк и релоадит).
Есть хитрый момент. Если с целью оптимизации производительности в акселераторе отключено отслеживание изменений файлов (apc.stat = 0 например), то надо не симлинк делать, а менять путь в конфиге (иначе в кэше акселератора останется старье).