Предоставление HTTP-доступа только для чтения к svn checkout на PHP-сервере?

У меня есть некоторые репозитории Subversion (изначально созданные с svnadmin) на сервере; есть аутентифицированный доступ SSH для чтения и записи через svn+ssh://, Для некоторых из этих SVN-репозиториев я хотел бы разрешить анонимный доступ только для чтения через http://, Проблема в том, что у меня нет административных свойств на этом сервере, поэтому я действительно не могу связываться с настройками сервера или запускать svnserve, но у меня могут быть скрипты PHP. Поэтому мне было интересно, есть ли какое-то решение, надеюсь, в PHP, которое позволило бы мне это сделать (реализовать «мост» к хранилищу Subversion, чтобы svn клиент мог бы проверить)

Я хотел бы сравнить то, что я хочу сделать с git, Если я сделаю git init в каталоге я получаю подпапку .git который содержит точно такое же содержимое голого репо. Я могу клонировать этот голый репо с git clone --bare ... а затем загрузить его на сервер — тогда я могу напрямую клонировать с помощью git clone http://... и расположение голого репо (кроме того, что сначала git будет жаловаться fatal: ... info/refs not found: did you run git update-server-info on the server?; это означает, что я должен включите хук после обновления по умолчанию [который] запускает git update-server-info для поддержания актуальности информации, используемой тупыми транспортами (например, HTTP).; или беги git update-server-info в голом репо, так info/refs генерируется — только тогда это пустое хранилище на сервере может быть клонировано на клиенте через HTTP).

Итак, я бы рассмотрел svnadmin созданный репо (с содержанием dav db format hooks locks README.txt) быть эквивалентным git репо (так как они оба содержат всю историю, без фактических файлов), поэтому я надеялся, что репозиторий svnadmin можно настроить для клонирования HTTP только для чтения (то есть, просто скопировав содержимое этой папки на сервер). ). К сожалению, это не так — кажется, что даже с доступом по HTTP, svn на самом деле общается с формой WebDAV на сервере (Пользователи Subversion: Re: каталог dav не существует; SVN RedBook: Что такое WebDAV?). Так я попробовал сабля / DAV вне, но после успешной простой настройки (протестировано с cadaver Инструмент командной строки DAV), я могу только получить svn: OPTIONS of 'http://...': 200 OK (http://...) если я укажу на каталог репозитория svnadmin (или на его dav/ подкаталог).

Я думаю, то, что я хочу, вероятно, не возможно в то время:

Re: SVN или GIT через WebDav с использованием SabreDAV — Группы Google

Протокол SVN требует TON расширений для простого webdav для работы. Тебе здесь в основном не повезло.

… но я хотел точно подтвердить этот вопрос …


Благодаря ответу от @Evert; но, к сожалению svnsync кажется, не помогает мне здесь (это терпит неудачу с «Репозиторий перемещен навсегда»); вот набор команд, в которых я запускаю bash в каталоге сервера Apache, с некоторыми ответами команд, написанными с префиксом #:

svn --version
# svn, version 1.6.6 (r40053)

cd /media/www
svnadmin create mytest.svnfs
svn co file:///media/www/mytest.svnfs mytest.svn

cd mytest.svn
echo aaa >> test.txt
svn add test.txt
svn commit -m "init commit"echo bbb >> test.txt
svn add test.txt
svn commit -m "2nd com  mit"wget -q --no-check-certificate http://localhost/mytest.svn -O - | head --bytes 120
# <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
# <html>
#  <head>
#   <title>Index of /mytest.svn</title>

cd ..
svnadmin create mytest.mirror
cat > mytest.mirror/hooks/pre-revprop-change <<'EOF'
#!/bin/sh
USER="$3"
if [ "$USER" = "syncuser" ]; then exit 0; fi

echo "Only the syncuser user can change revprops" >&2
exit 1
EOF
chmod +x mytest.mirror/hooks/pre-revprop-change
cat > mytest.mirror/hooks/start-commit <<'EOF'
#!/bin/sh

USER="$2"
if [ "$USER" = "syncuser" ]; then exit 0; fi

echo "Only the syncuser user may commit new revisions" >&2
exit 1
EOF
chmod +x mytest.mirror/hooks/start-commit
ls --ignore="*.tmpl" mytest.mirror/hooks/
# pre-revprop-change  start-commit

svnsync initialize file:///media/www/mytest.mirror http://localhost/mytest.svnfs/ --sync-username syncuser --sync-password syncpass
# svnsync: Repository moved permanently to 'http://localhost/mytest.svnfs/'; please relocate

# trying the working copy (even if it shouldn't work):
svnsync initialize file:///media/www/mytest.mirror http://localhost/mytest.svn/ --sync-username syncuser --sync-password syncpass
# svnsync: Repository moved permanently to 'http://localhost/mytest.svn/'; please relocate

0

Решение

Я написал этот ответ, и он до сих пор остается верным.

В двух словах:

  1. СВН сервер может говорить на webdav, Delta-V (расширение версий для webdav)
  2. Клиент SVN использует преимущества этого сервера, но также требует SVN расширения.

Это было правдой несколько лет назад, поэтому ситуация могла измениться … но я в этом искренне сомневаюсь.

Однако .. для того, что вы хотите сделать, звучит так, как будто вы просто хотите использовать svnsync,

http://svnbook.red-bean.com/en/1.7/svn.reposadmin.maint.html#svn.reposadmin.maint.tk.svnsync

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]