4

不管我是如何到达这里的,我都处于从备份中恢复 SVN 存储库的位置。不幸的是,备份略有损坏,在 19000 多个修订版中,大约有 80 个丢失了。备份是一个 bzip2 文件,我能够使用 bzip2recover 恢复大约 99% 的块。这些是“已知良好”,因为它们已成功解压缩。

因此,我能够创建一个已知良好提交和丢失提交的列表。

原始存储库也已损坏,但许多文件仍然存在。不幸的是,整个存储库都被破坏了。

所以我很幸运能够从原始 db/revs 和 db/revprops 目录中获得这些缺失修订的文件。很可能备份 bz2 文件的损坏与 db/revs 文件的损坏不一致。

我已将所有内容重建到 r13892,但我知道 r13893 已损坏,因此我没有 r13893 的转储。我确实有原始存储库中的文件 db/revs/13893 和 db/revprops/13893。

我使用 svn-1.4 创建并重建了存储库,但我升级到了 svn-1.6,以便可以使用选择性 svnadmin verify 命令(在单个或一系列提交上)。

我想也许我可以将这两个文件放入新的存储库中,更新 db/current [1] 然后继续。但是,当我尝试验证时出现此错误:

$ svnadmin verify new-svn
* Verified revision 1.
...
* Verified revision 13889.
* Verified revision 13890.
* Verified revision 13891.
* Verified revision 13892.
svnadmin: Can't read file 'svn/db/revs/13214': End of file found

所以这显然行不通。不确定 13214 与这里的任何东西有什么关系。

我降级回 svn-1.4.6 以防 1.6 发生任何奇怪的事情。不幸的是,我得到了相同的结果 - 修订版 13893 未验证:

...
* Verified revision 13891.
* Verified revision 13892. svnadmin: Can't read file 'svn/db/revs/13214':
End of file found

所以这就是我所知道的:

  • 我知道修订版 1 到 13892 是 100% 正确的(除非极不可能的情况下 bz2 块解压缩不正确但通过了校验和)。
  • 我不知道原始 SVN 存储库中的 r13893 文件是否正常 - 它们可能已损坏,但损坏的数量非常小,不太可能(但可能)。

有谁知道我如何能够填补这个洞?请注意,我拥有一个 100% 自信的 r13894,因此如果我可以插入 r13893,我可以继续进行其余的恢复。

[1] 我用这个脚本更新了 db/current:http: //svn.haxx.se/users/archive-2005-12/att-0630/make-current-fix.py

我在其他一些 SVN 存储库上对此进行了测试(在禁用对 db/current 的写入之后!)以验证它产生的值与已经存在的值相同。确实如此。

4

1 回答 1

2

关于这一点:

svnadmin: Can't read file 'svn/db/revs/13214': End of file found

我怀疑 rev 13893 引用了 rev 13214 中的某些内容(例如文件副本、skip-rev 内容或其他内容)。

在进行 svn 加载时,新版本是否与原始版本匹配?我记得遇到过这样的情况,我的转储引用了 rev 0,它被加载为 rev 1。如果这里发生类似的事情,对 rev 13214 的反向引用将关闭一个。

您可以尝试使用 repo db 中的文件以转储格式创建丢失的 rev。不幸的是,我不知道有什么工具可以做到这一点。但我建议看一下SvnDumpTool;它能够以许多有用的方式操纵 svn 转储。

披露:我过去曾为 svndumptool 做出过贡献

于 2009-08-19T02:50:06.290 回答