我目前有一个老化的 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 格式。
我很欣赏这是一个很长的问题,但我希望我已经明确了我想要实现的目标。随意告诉我我疯了 - 感觉就像我已经接近让它工作了:)。