Назад | Перейти на главную страницу

Смешиваете Subversion «SVNParentPath» и конфигурации для каждого репозитория?

Учитывая типичную конфигурацию Subversion / Apache с использованием SVNParentPath, с репозиториями, размещенными в /svn/ как это:

<Location /svn>
    DAV svn

    SVNParentPath /srv/source/svn/repos
    SVNReposName "Subversion Repository"

    AuthzSVNAccessFile /srv/source/svn/authz
    Satisfy Any

    AuthType                Basic
    AuthBasicProvider       file
    AuthName "Subversion Repository"
    AuthUserFile /srv/source/svn/htpasswd

    Require valid-user
</Location>

Есть ли способ переопределить эту конфигурацию для определенных репозиториев без нужно разместить их на другом пути? То есть есть ли способ добавить Location блок вроде этого ...

<Location /svn/my_special_repo>
    SVNPath /srv/source/svn/repos/my_special_repo
    AuthzSVNAccessFile /srv/source/svn/repos/my_special_repo/conf/authz
</Location>

... и имейте это отменять конфигурация, представленная в Location блок для /svn? Мои попытки сделать это с указанной выше конфигурацией натолкнулись на странные и бесполезные ошибки в журнале ошибок Apache, например:

[Wed Feb 02 11:28:35 2011] [error] [client 10.10.209.120]
(20014)Internal error: Can't open file '/srv/source/svn/repos/svn/format':
No such file or directory

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

РЕДАКТИРОВАТЬ: Ну, я вижу, что этот вопрос вызвал большой интерес у читателей. Для записи, что я могу в конечном итоге сделать, так это создать конфигурации для каждого репозитория для всех наших существующих репозиториев, а затем отказаться от SVNParentPath на основе конфигурации. Конфигурация Apache для каждого репо минимальна, особенно с использованием чего-то вроде mod_macro; сложная часть будет разделять глобальный файл authz. Если вы делали это раньше, мы будем благодарны за советы.

Мне неприятно видеть, как мой собственный вопрос томится там в списке неотвеченных вопросов, поэтому вот что мы сделали:

  • В нашей основной конфигурации сервера у нас есть:

      <Location /svn/>
            SVNParentPath /srv/source/svn/repos
      </Location>
    
  • Мы приняли следующие mod_macro чтобы воспроизвести это поведение для новых репозиториев:

    <Macro LegacySubversionRepo $name>
        # Override SVNParentPath block in main vhost config.
        RewriteRule ^/svn/$name /repo/$name [PT]
    
        <Location /repo/$name>
                Order                   deny,allow
                Allow                   from all
    
                Use LdapAuth \
                        "$name svn repository" \
                        /srv/source/svn/htpasswd
    
                DAV svn
                SVNPath /srv/source/svn/repos/$name
                AuthzSVNAccessFile /srv/source/svn/authz
                SVNAutoversioning On
                Satisfy Any
        </Location>
    </Macro>
    

    В RewriteRule позволяет конфигурации репозитория переопределить <Location /svn/> в основной конфигурации, которая в противном случае соответствовала бы запросу.

Благодаря этому становится относительно легко адаптировать конфигурацию аутентификации и авторизации для каждого репозитория (вместо глобального htpasswd файл, используемый здесь).