【问题标题】:Svnsync can't sync repositorySvnsync 无法同步存储库
【发布时间】:2011-11-12 00:54:51
【问题描述】:

我有远程 Subversion 存储库的读取权限,我想通过 svnsync 克隆它。同步开始正常并且进展顺利,但在接近尾声时出现如下错误:

Transmitting file data ...svnsync: File not found: transaction '12893-qyy', path
 '/project_name/trunk/path/to/file.cpp'

我可以成功地检查出有问题的版本、上一个版本和下一个版本。所有文件都已到位。我已经检查了有问题的文件的日志 - 它的文件夹在以前的版本中被移到了这个地方。

有什么方法可以强制 svnsync 忽略此错误并继续同步?我没有对存储库的管理员访问权限,所以我无法修复它。

更新:回答 cmets:我检查了与服务器使用 (1.6.6)、最新稳定版 (1.6.17) 和 beta 版 (1.7) 相同的 subversion 客户端。全部给出完全相同的错误。此外,我可以成功签出“损坏”存储库:最新版本、有问题的版本 (12893)、之前的版本 (12892) 和之后的版本 (12894),没有任何错误。

更新:回答更多 cmets:svn 日志显示在修订版 12892 中,文件夹“to”已从 /repo/other_project/trunk/source_path 移至 /repo/project_name/trunk/path

【问题讨论】:

  • 您运行的 SVN 版本是否与服务器相同?
  • 是的。我试过完全相同的版本,最新的稳定版 1.6.17 版和 1.7 beta 版。同样的错误。
  • 很奇怪。您是否尝试过结帐以查看是否有效?如果 repo 损坏,您将无法同步。
  • @qor72 当然可以。我可以签出最新版本,版本 12893,之前的版本和之后的版本 :(。我需要做的就是同步存储库 - 我不在乎它是否包含有问题的文件。但是 svnsync 只是停止这个愚蠢的错误,让我没有选择继续同步:(。
  • 鉴于它正在尝试制作 repo 的副本(同步),这并不奇怪 - 如果它遇到错误并跳过文件,它将无法对该文件应用修订向前走。在这种情况下很痛苦......

标签: svn svnsync


【解决方案1】:

鉴于您可以在此之前和之后签出修订,我猜您没有任何存储库损坏。 svnsync 通过“重放”事务而不是镜像数据或类似的东西来工作。因此,可能存在阻止它重播事务的错误。我猜想该提交的某些内容触发了错误。您可以运行 svn log -c 12893 -v 来更详细地查看修订版。我猜它里面有一些东西,比如导致问题的'R'eplace。您可以收集信息并将其发送到 users@subversion.apache.org,以便对其进行分析并希望得到修复。

这里有一些其他的想法:

  • 如何访问源存储库? file:// http:// 等。如果是 http://,您可以尝试从使用 Neon 的默认 HTTP 库更改为 Serf,看看它是否仍然存在问题。你可以通过在运行 svnsync 命令时添加 --config-option=servers:global:http-library=serf 来做到这一点。值得一试。

  • 查看是否可以转储修订版。 svnadmin dump -r12892:12893 --incremental reposname > dumpfile

  • 如果您可以转储修订版,则可以使用 svnadmin load 手动将其加载到目标存储库中。

  • 如果您可以加载修订版,那么您可以手动修复 svnsync 的属性,以便它知道它执行了该修订版。 svn ps --revprop -r0 svn:sync-last-merged-rev 123893 url://to/mirror

更新:问题已通过使用 subversion 1.7 RC2 中的新 svnrdump 实用程序解决。

【讨论】:

  • 通过 HTTPS 访问存储库。我无法更改访问方法,因为我没有对存储库的管理员访问权限。我无法转储修订版,因为我没有对存储库的管理员访问权限。
  • svn 日志显示,在修订版 12892 中,文件夹“to”已从 /repo/other_project/trunk/source_path 移至 /repo/project_name/trunk/path
  • 您可以更改 svnsync 在从 https 存储库读取时使用的库。默认情况下它使用霓虹灯,但还有另一个库 serf 的工作方式略有不同。 也许没有同样的问题。
  • 因为您似乎愿意尝试 1.7 RC,它还带有一个名为 svnrdump 的新工具,可让您通过 http 进行转储。试试这个:svnrdump dump --incremental -r12892:12893 server/repos > dumpfile
  • 抱歉,由于某种原因,我没有收到有关 cmets 的通知,需要检查我的设置。您可以使用 svnadmin load 加载转储文件。如果您使用 1.7 中的 svnsync 来 --init 您的存储库,您可以让它将最后同步的修订设置为您通过转储文件加载的修订。
【解决方案2】:

要添加到上面的响应中,解决我的问题的最后手段是使用 svndumpfilter 命令排除损坏的节点。

每次我在使用 svnrdump 后尝试加载特定版本时,都会收到以下错误;

... svnadmin: E160004: 文件系统已损坏 svnadmin:E200014:读取表示时校验和不匹配: 预期:77ec72e82afddd1cb8d2c63760cf4dbb 实际:f34fb5883dffffec3cd59a69f8a2cb99

如果您已将修订的转储创建为 rev12892.dmp,那么您可以排除路径,例如。 “/project_name/trunk/path”如下;

svndumpfilter 排除 /project_name/trunk/path pruned_dump_file

有关 svndumpfilter 命令的详细信息,请参阅 svn 红皮书:http://svnbook.red-bean.com/en/1.7/svn.ref.svndumpfilter.commands.c.exclude.html

【讨论】:

    猜你喜欢
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多