1

我目前有一个老化的 subversion 1.4.2 服务器,其中包含多个要升级的存储库。我想做几件事:

  • 移动到更新版本(1.7+)的颠覆
  • 将存储库拆分到不同的机器
  • 更改主机名(我稍后会解释)
  • 更改为使用 FQDN 而不是 URL 上的路径(<-- 这是我遇到的问题)

但是,我希望很少的停机时间,并且我希望逐步地(在很大程度上)无缝地为我们的用户执行此操作。

因此,服务器当前由:svn.svr.mycompany.co.uk 解析我希望用户切换到使用:svn.mycompanyglobal.net

该新名称将由 DNS 路由到适当的服务器,具体取决于用户所在的大陆。这行得通。

这指向具有标准类型的 svn DAV 访问权限的 Apache2 安装:

<VirtualHost 10.11.22.33>
  Servername svn.svr.mycompany.co.uk

  <Location /main>
    DAV svn
    SVNPath /home/svnrepo/main
    [... Some regular auth stuff ...]
    SVNIndexXSLT /svnindex.xsl
  </Location>

  <Location /data>
    DAV svn
    SVNPath /home/svnrepo/data
    [... Some regular auth stuff ...]
    SVNIndexXSLT /svnindex.xsl
  </Location>
</VirtualHost>

有与文档根和模块相关的常见内容,但这是它的症结所在。

所以,目前我可以查看以下代码:http ://svn.svr.mycompany.co.uk/data/Core/Blah

现在我在前面放了一个nginx反向代理。它具有全局主机名,我可以通过 URL浏览代码:http: //data.svn.mycompanyglobal.net/Core/Blah请注意,我已将“数据”从路径移至主机名)。我通过添加以下配置在nginx中实现了这一点:

server {
  listen 80;

  server_name data.svn.mycompanyglobal.net;

  proxy_set_header  Host svn.svr.mycompany.co.uk;

  location = /svnindex.xsl {
    proxy_pass http://svn.svr.mycompany.co.uk/svnindex.xsl;
  }

  location /data/ {
    proxy_pass http://svn.svr.mycompany.co.uk/data/;
  }

  location / {
    proxy_pass http://svn.svr.mycompany.co.uk/;
    rewrite ^(.*)$ /data$1 break;
  }
}

这一切都有效。我可以在 Web 浏览器中浏览代码,也可以通过 TortoiseSVN 中的 repo 浏览器或命令行“svn ls”浏览代码。所有这些都通过代理。

但是,当我尝试检查代码时,我得到了错误

Unusable URI: it does not refer to this repository

我得出的结论是,这是客户做出此决定(即提出错误)。查看 SVNKit 源代码,很明显 svn 客户端会将它请求的路径与服务器返回的路径进行比较——我不知道为什么,但这就是它的样子(参见DavUtils)。

我可以通过将我结帐的 URL 更改为此来解决这个问题(某种程度上):

http://data.svn.mycompanyglobal.net/data

[即我将存储库的名称添加到末尾]

这可能是因为我在上面添加了“/data/”路由。

有没有人设法做这样的事情?我可以在 Subversion 服务器或代理上做些什么来改变 Subversion 客户端的路径表示吗?

我知道一旦我把它放到单独的服务器上,它就不会成为问题,因为每台服务器只会列出一个“位置”(根),但我现在没有这个奢侈。

此外,您可能应该记住,这个盒子已经存在了很多年,并且有很多硬编码的引用。这就是为什么我需要代理它,以便我可以逐步将所有引用移动到新的 URL 格式。

我很欣赏这是一个很长的问题,但我希望我已经明确了我想要实现的目标。随意告诉我我疯了 - 感觉就像我已经接近让它工作了:)。

4

2 回答 2

1

所以我最终通过编辑端点服务器(即我要离开的那个)来在两个不同的位置拥有相同的存储库:

<VirtualHost 10.11.22.33>
  Servername svn.svr.mycompany.co.uk

  <Location /data>
    DAV svn
    SVNPath /home/svnrepo/data
    [... Some regular auth stuff ...]
  </Location>
</VirtualHost>

<VirtualHost 10.11.22.33>
  Servername data.svn.svr.mycompany.co.uk

  <Location />
    DAV svn
    SVNPath /home/svnrepo/data
    [... Some regular auth stuff ...]
  </Location>
</VirtualHost>

事实证明,颠覆可以很好地处理这个问题。然后我的代理变得微不足道。显然,我在这里不需要代理,但是当我开始破坏端点服务器时我会这样做。

现在我可以结帐、浏览和签到:

http://data.svn.mycompanyglobal.net/
http://data.svn.svr.mycompany.co.uk/
http://svn.svr.mycompany.co.uk/data

第一个将路由到代理服务器并代理到第二个。第二个和第三个(如果直接连接)将直接路由到旧服务器。

作为参考,我的 nginx 代理条目现在看起来像这样:

server {
  listen 80;
  listen 443 ssl;

  server_name data.svn.mycompanyglobal.net;

  proxy_set_header     Host data.svn.svr.mycompany.co.uk;

  location / {
    proxy_pass http://data.svn.svr.mycompany.co.uk/;
  }
}

每个存储库都会有其中一个(在我上面的示例中为“数据”和“主”)。

于 2012-05-18T12:53:15.427 回答
1

我可能正确理解您的上下文。我确定您知道这一点,但 SVN 也在不同的端口上运行,所以您可能会遇到问题 :)

关于locationnginx 中的参数,您必须记住,它仅定义您在配置中设置的服务器名称的位置。data.svn.company.com因此,对于您在定义该子域的每个位置时定义的唯一服务器名称。我认为您实际上是在尝试定义多个子域。

因此,如果是这种情况,您将不得不设置多个服务器名称main.svn.company.comdata.svn.company.com而不是定义位置 URI。

希望有帮助:)

于 2012-05-13T03:02:54.430 回答