如何使用一个损坏的修订版修复存储库?

时间:2011-04-04 19:23:56

标签: svn svnadmin

我的家庭服务器出现硬盘故障。

一旦我意识到磁盘正在运行,我就登录并直接复制了我的存储库,其中包含多个项目。

但是,由于磁盘发生故障,其中一个修订版已被破坏:

$ svnadmin verify master/
[...]
* Verified revision 820.
* Verified revision 821.
* Verified revision 822.
svnadmin: No such revision 823

master/db/revs/master/db/revprops/目录确实不包含任何名为823的文件,因此缺少(损坏)此修订版。在master/存储库中有后续修订版(我真的想保留!),直到修订版#947。

今天我拿到了我最近的异地备份(!),其中包含了这个版本。我希望通过修复缺少的修订来“修复”master/中已损坏的存储库,因为它比备份更新。

我确保将转储文件加载到新创建的存储库中,其版本与master/中复制的版本相同,因此它是所有旧的“线性”格式3.

我尝试了显而易见的,只是从备份的823db/revs/目录中复制文件db/revprops/

$ cp repos/db/revs/0/823 master/db/revs/
$ cp repos/db/revprops/0/823 master/db/revprops/

目录repos/包含已从备份转储加载的存储库。现在我明白了:

$ svnadmin verify master/
[...]
* Verified revision 821.
* Verified revision 822.
svnadmin: /build/buildd/subversion-1.6.12dfsg/subversion/libsvn_delta/compose_delta.c:165: search_offset_index: Assertion `offset < ndx->offs[ndx->length]' failed.
Aborted

这不是很令人鼓舞。我尝试了其他各种svnadmin命令,但没有一个让验证者感到高兴。

我的下一个想法是退出复制并从损坏的存储库的“新”副本开始,然后在 823之后转储修订版,并与备份合并。但这似乎不可能,我不能在丢失之后转储修订:

$ svnadmin dump -r 824 master/ >r824.dmp
svnadmin: No such revision 823

请注意,使转储“增量”没有帮助,希望它应该假装世界从修订版824开始,然后从那里开始:

$ svnadmin dump --incremental -r 824:947 master/ > dump.txt
svnadmin: No such revision 823

这会将输出写入dump.txt,但我不确定是否可以依赖它。请注意,它不会记录它已成功转储任何版本。

更新:我有另一个想法:将较新的修订文件从master/中的崩溃磁盘副本复制到备份中,以提供“缺失的尾巴”:

$ for a in $(seq 910 947) ; do cp  master/db/revs/$a repos/db/revs ; cp master/db/revprops/$a repos/db/revprops/ ; echo $a ; done

但是,这似乎只会破坏目标存储库:

$ svnadmin verify repos/
[...]
* Verified revision 907.
* Verified revision 908.
* Verified revision 909.
svnadmin: Corrupt representation '907 21815 45 30922 158d3e72732f45bf6f02919b22fc899a'
svnadmin: Malformed representation header

现在,我的想法已经用完了。

1 个答案:

答案 0 :(得分:37)

我解决了。

一旦我意识到,解决方案(当然)是显而易见的。

我有这个:

  • master/:一个破损的存储库副本,其版本为0..947,修订版823的文件实际上已丢失。
  • repos/:从备份(转储文件)加载的存储库,涵盖版本0..910。

解决方案只是从master/转储,从修订版911开始。这是可能的,没有任何错误,我认为这意味着911..947范围内的任何修订都不直接依赖于修订版823中的状态,或者其他:

$ svnadmin dump --incremental -r 911:947 master/ > tail.txt
* Dumped revision 911.
* Dumped revision 912.
* Dumped revision 913.
[...]
* Dumped revision 947.

无论如何,只需将转储应用于来自备份的存储库:

$ cat tail.txt | svnadmin load repos/
[lots of commits]

现在我恢复了完整的历史,没有问题:

$ svnadmin verify repos/
* Verified revision 0.
* Verified revision 1.
* Verified revision 2.
[...]
* Verified revision 945.
* Verified revision 946.
* Verified revision 947.

耶!