如何修复一个修订版本的版本库?

我的家庭服务器有一个硬盘驱动器故障。

一旦我意识到磁盘正在进行,我login并做了我的存储库,其中包含多个项目的直接副本。

但是,由于磁盘失败,其中一个版本被破坏:

$ 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。

今天我find了我最近的异地备份(!),它很高兴地包含了这个版本。 我想通过修复缺less的修订版来“修复” master/损坏的版本库,因为它比备份更新。

我确保将转储文件加载到与master/复制的版本相同的新创build的存储库中,所以它都是旧的“线性”格式3。

我试过很明显的,只是从备份的db/revs/db/revprops/目录复制文件823

 $ 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命令,但没有一个让validation者高兴。

我的下一个想法是退出复制,并从破损的存储库的“新鲜”副本开始,然后 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 ,但我不确定是否可以依赖。 请注意,它不会logging它成功转储任何修订。

更新 :我还有一个想法:将新版本的文件从master/的crash-disk-copy复制到备份中,以提供“missing tail”:

 $ 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 

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

我解决了它。

一旦我意识到,解决scheme当然是显而易见的。

我有这个:

  • 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. 

好极了!