SVN恢复 - 恢复单个版本

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的写入之后!),以验证它产生的值与已经存在的值相同。它确实如此。
1个回答

2
关于这个:
svnadmin: Can't read file 'svn/db/revs/13214': End of file found

我怀疑第13893次修订引用了第13214次修订中的某些内容(例如文件复制、跳过修订等等)。
在进行svn加载时,新的修订是否与原始修订匹配?我记得曾经遇到过这样一个情况,我的转储引用了第0次修订,但它被加载为第1次修订。如果这里发生了类似的情况,对第13214次修订的反向引用将会偏离一个。
您可以尝试使用repo db中的文件以转储格式创建缺失的修订版本。不幸的是,我不知道有哪些工具可以这样做。但我建议看一下SvnDumpTool;它能够以很多有用的方式操作svn转储。 声明:我曾经为svndumptool做出过贡献

是的,在r13893的顶部,它说: DELTA 13214 0 12567271因此,它是在13214之上的增量,这解释了它来自哪里。我注意到的一件事是,我的重建二进制提交(在db / revs中)以此开始: SVN ^ A ^ @ ^ @ <86> <A0> ^@然而,我的原始r13893提交看起来像这样: SVN ^ @ ^ @ <86> <A0> ^@请注意,“SVN”后面的第一个字节在旧提交中为^@(00),而在新提交中为^A(01)。这是xdelta版本号吗?也许我需要使用相同的xdelta格式重新构建1到13892的版本的subversion? - davidA
我不清楚^@和^A的区别。但是在加载转储文件时,它应该告诉你原始版本号和新创建版本号分别是多少。这两个数字是否匹配? - retracile
1
是的,这些数字是匹配的。实际上我解决了这个问题——因为我用1.4创建了新的repo,但旧文件是用1.3创建的,所以xdelta格式不同。我再次开始使用svn-1.3,现在这个问题已经解决了。不幸的是,svnadmin稍后会发生segfault错误,所以一切还没有完全好转... - davidA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接