У меня есть некоторые репозитории 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
Я написал этот ответ, и он до сих пор остается верным.
В двух словах:
Это было правдой несколько лет назад, поэтому ситуация могла измениться … но я в этом искренне сомневаюсь.
Однако .. для того, что вы хотите сделать, звучит так, как будто вы просто хотите использовать svnsync
,
http://svnbook.red-bean.com/en/1.7/svn.reposadmin.maint.html#svn.reposadmin.maint.tk.svnsync
Других решений пока нет …