我的家庭服务器出现硬盘故障.
一旦我意识到磁盘正在运行,我就登录并直接复制了我的存储库,其中包含多个项目.
但是,由于磁盘发生故障,其中一个修订版本被破坏:
$ svnadmin verify master/
[...]
* Verified revision 820.
* Verified revision 821.
* Verified revision 822.
svnadmin: No such revision 823
Run Code Online (Sandbox Code Playgroud)
该master/db/revs/和master/db/revprops/目录做的,的确,不包含任何所谓的文件823,所以这个版本缺少(断).随后的修订版(我真的想保留!)在master/版本#947 的存储库中.
今天我拿到了我最近的异地备份(!),其中包含了这个版本.我想master/通过修复缺少的修订来"修复"损坏的存储库,因为它比备份更新.
我确保将转储文件加载到新创建的存储库中,该存储库与复制的存储库具有相同的版本master/,因此它是所有旧的"线性"格式3.
我尝试了显而易见的,只是823从备份db/revs/和db/revprops/目录中复制文件:
$ cp repos/db/revs/0/823 master/db/revs/
$ cp repos/db/revprops/0/823 master/db/revprops/
Run Code Online (Sandbox Code Playgroud)
该目录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
Run Code Online (Sandbox Code Playgroud)
这不是很令人鼓舞.我已经尝试了各种其他svnadmin命令,但没有一个让验证者高兴.
我的下一个想法是退出复制并从损坏的存储库的"新"副本开始,然后在 823 之后转储修订,并与备份合并.但这似乎不可能,我不能在丢失之后转储修订:
$ svnadmin dump -r 824 master/ >r824.dmp
svnadmin: No such revision 823
Run Code Online (Sandbox Code Playgroud)
请注意,它无法使转储"增量",希望它应该假装世界从修订版824开始,然后从那里开始:
$ svnadmin dump --incremental -r 824:947 master/ > dump.txt
svnadmin: No such revision 823
Run Code Online (Sandbox Code Playgroud)
这会写输出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
Run Code Online (Sandbox Code Playgroud)
但是,这似乎只会破坏目标存储库:
$ svnadmin verify repos/
[...]
* Verified revision 907.
* Verified revision 908.
* Verified revision 909.
svnadmin: Corrupt representation '907 21815 45 30922 158d3e72732f45bf6f02919b22fc899a'
svnadmin: Malformed representation header
Run Code Online (Sandbox Code Playgroud)
现在,我已经没想完了.
unw*_*ind 38
我解决了
一旦我意识到,解决方案(当然)是显而易见的.
我有这个:
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.
Run Code Online (Sandbox Code Playgroud)
无论如何,只需将转储应用于来自备份的存储库:
$ cat tail.txt | svnadmin load repos/
[lots of commits]
Run Code Online (Sandbox Code Playgroud)
现在我恢复了完整的历史,没有问题:
$ svnadmin verify repos/
* Verified revision 0.
* Verified revision 1.
* Verified revision 2.
[...]
* Verified revision 945.
* Verified revision 946.
* Verified revision 947.
Run Code Online (Sandbox Code Playgroud)
好极了!
| 归档时间: |
|
| 查看次数: |
40841 次 |
| 最近记录: |