SVN 服务器上的“svn checkout”导致 repo 中断并出现 301 错误

SVN 服务器上的“svn checkout”导致 repo 中断并出现 301 错误

我们有一个 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错误而拒绝。

更令人困惑的是,这个存储库服务器还托管了我们的哈德森CI 服务器,每小时都会拉取和构建我们的项目。这让我们怀疑是 svn 客户端导致了通信错误。

这也非常令人困惑,删除然后重新创建 reposvnadmin不会重置错误 - repo 是仍然不可用,尽管它是“新的”!重新启动 apache 和 subversion (svnserve) 对此或原始错误没有影响。

版本信息:

  • 操作系统:64位CentOS 4.2,2.6.27内核
  • svn 客户端:1.4.2(服务器和远程客户端相同)
  • svn服务器:1.4.2
  • httpd: 2.2.3

更新:

在 repo 服务器上运行时也会发生这种情况svn export。从任何其他盒子/客户端运行,都没有问题。以下是工作流程,以帮助澄清错误:

  1. [~repo-server~]# svnadmin create {repo}; chown -Rf www:www {repo}
  2. [remote-client]# svn checkout http://svn.ourdomain.tld/repo
  3. [remote-client]# svn add file; svn ci -m ''
  4. [~repo-server~]# cd /var/www; svn export file:///path/to/repo/trunk ourproject
  5. [remote-client]# svn update 失败并出现 301 错误

我还可以确认盒子的主机名在这里没有效果,这很奇怪:无论是否svn.ourdomain.tld添加到/etc/hosts它仍然会中断 - 我们认为这可能是本地主机路由的问题,但事实似乎并非如此。

我们是否遗漏了文档中的某些内容,即当服务器位于同一台机器上时,您无法签出存储库?我们如何在本地签出时防止存储库损坏?

答案1

svn 不处理 HTTP 重定向(这就是 301 错误),查看重定向指向的位置(wget、wireshark),从那里检出。

这也是 apache 特有的问题,虚拟主机配置可能会破坏它。

相关内容