Subversion COPY/MOVE-未找到文件:事务'XXX-XX'

Subversion COPY/MOVE-未找到文件:事务'XXX-XX'

我尝试在其中一个 Subversion 存储库中创建一个分支,但一直遇到错误。无论我做了什么,我都会收到以下信息:

未找到文件:事务'3062-2e6',路径'/Software/XXXXXX/branches/testbranch'

我注意到上述消息中“3063-3e6”的第一部分是存储库中最后一次成功提交的修订。我的 apache 日志没有提供更多信息:

[Wed Nov 24 14:10:38 2010] [error] [client x.x.x.x] Could not MOVE/COPY /svn/p070361/!svn/bc/3049/Software/SXXXXXX/trunk.  [404, #0]
[Wed Nov 24 14:10:38 2010] [error] [client x.x.x.x] Unable to make a filesystem copy.  [404, #160013]
[Wed Nov 24 14:10:38 2010] [error] [client x.x.x.x] File not found: transaction '3059-2e2', path '/Software/XXXXXX/branches/testbranch'  [404, #160013]

这一切都发生在一台服务器上,该服务器具有一个 nginx 前端,代理 Apache 以获取 subversion 位。其他存储库能够正常分支,我能够使用 file:/// 从发生此情况的服务器上的命令行创建分支。此存储库的权限与其他所有存储库匹配,磁盘空间不是问题。

答案1

您的 svn 结构可能没有“Software/XXXXXX/branches”目录,但必须有该目录才能在此创建“testbranch”。您应该手动创建此目录(“branches”),然后创建一个分支。

答案2

如果目标路径上的子目录尚不存在,则会出现此无用错误消息。虽然您可以手动创建它们(使用svn mkdir),但使用--parents选项更简单。

    svn cp ^/trunk/bigproject ^/branches/experimental/bigproject -m 'test branch'

如果branchesexperimental不存在,则命令将失败。这应该有效:

    svn cp --parents ^/trunk/bigproject ^/branches/experimental/bigproject -m 'test branch'

答案3

我们遇到了完全相同的问题,遗憾的是这里只有无用的答案。

这不是 svn 的问题,而是 nginx 的问题。正如 OP 在评论中提到的,这与路径中的空格(或其他需要 url 编码的字符)有关。当它到达 svn 时,会发生过度编码,因此路径是错误的。

nginx 上的旧漏洞

但是 nginx 重写规则中有一个解决方法,可以避免这种额外的错误编码:

发生错误的编码:

if ( $http_destination ~* ^(.*)$ )
{
    set $fixed_destination $1;
}

无需额外编码:

if ( $http_destination ~* ^(?<fix>.*)$ )
{
    set $fixed_destination $fix;
}    

解决方案是使用命名组,这就是导致 nginx 在这种情况下表现不同的差异,但我们没有找到任何解释这一点的文档。

答案4

我知道这不是解决您的问题的直接答案,但如果您想有效地使用分支,您应该考虑使用其他版本控制系统,如 git、mercurial 或 bazzar。

或者如果你不想进行完全迁移,你可以使用 git-svn 作为你的 svn 存储库的“前端”,我建议你阅读了解有关 git-svn 的更多信息。

相关内容