我们有一个nginx服务器代理Apache + SVN的标准设置。 nginx的设置是一个非常简单的代理:
server { server_name svn.ourdomain.tld; location / { proxy_pass http://localhost:8080; } }
Apache的设置如下:
<Location /> DAV svn SVNParentPath /var/svn AuthType Basic AuthName "Authentication Required" AuthUserFile /var/svn/.auth Require valid-user </Location>
…它允许我们使用像http://svn.ourdomain.tld/repo这样的东西来访问存储库。 我们现在已经运行了这个设置了大约2年没有问题。
最近我们发现,我们需要将其中一个存储库检出到服务器本身上,但是每当我们这样做的时候,似乎就会打破回购。 从那一刻起,它只会回应一个301 Moved Permanently错误。
我们已经尝试过:
svn co file:///path/to/repo svn co svn://localhost/repo svn co svn://svn.ourdomain.tld/repo svn co svn+ssh://localhost/repo svn co svn+ssh://svn.ourdomain.tld/repo svn co http://localhost/repo svn co http://svn.ourdomain.tld/repo 也尝试绕过nginx,并得到相同的错误:
svn co http://localhost:8080/repo svn co http://svn.ourdomain.tld:8080/repo 从另外一台机器上检出,按照预期工作, 直到我们试图检出服务器,然后拒绝301错误。
更令人困惑的是,这个版本库服务器还托pipe着我们的Hudson CI服务器,它可以每小时抽出和build立我们的项目。 这导致我们怀疑这是导致通信错误的svn客户端。
它也非常混乱,删除然后使用svnadmin重新创build回购不会重置错误 – 即使它是“新”回购仍然不可用! 重新启动Apache和颠覆(svnserve)没有影响,或原来的错误。
版本信息:
更新:
当在repo服务器上运行时, svn export也会发生这种情况。 从任何其他箱子/客户端,都没有问题。 以下是工作stream程,以帮助澄清错误:
[~repo-server~]# svnadmin create {repo}; chown -Rf www:www {repo} [remote-client]# svn checkout http://svn.ourdomain.tld/repo [remote-client]# svn add file; svn ci -m '' [~repo-server~]# cd /var/www; svn export file:///path/to/repo/trunk ourproject [remote-client]# svn update 失败,301错误 我也可以确认这个盒子的主机名在这里没有效果,这很奇怪:是否将svn.ourdomain.tld添加到/etc/hosts它仍然中断 – 我们认为这可能是一个问题本地主机路由,但似乎并非如此。
我们是否在文档中缺less一些说明当服务器位于同一个盒子时无法检出回购的问题? 当我们在本地结账时,如何阻止回购变得腐败?
svn不处理HTTPredirect(这就是301错误),看看redirect指向(wget,wireshark),从那里结帐。
另外它是apache的具体问题,虚拟主机configuration可以打破它。