如何修复一个修订版本的版本库?
我的家庭服务器有一个硬盘驱动器故障。
一旦我意识到磁盘正在进行,我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.
好极了!