我的家庭服務器出現硬盤故障。如何修復具有一個損壞版本的存儲庫?
一旦我意識到磁盤正在運行,我登錄並執行了一個包含多個項目的存儲庫的直接副本。
然而,由於該盤是失敗,修訂版本的一個被打破:
$ 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.
我嘗試了很明顯,只是文件823
從備份的db/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
現在,我已經用完了想法。
開始認爲這可能是其他StackExchange站點中的一種,但在這裏似乎有很多類似的問題。 – unwind 2011-04-07 09:26:41
沒關係,關於版本控制工具的問題在這裏是公平的遊戲。 [FAQ](http://stackoverflow.com/faq)提到了「程序員常用的軟件工具」,版本控制很少用於其他領域(至少是非程序員)。 – 2011-04-08 20:15:58
關於恢復損壞的存儲庫,我剛剛發現這個非常有趣的文章: https://spin.atomicobject.com/2015/10/06/svn-corruption-recovery/ – AFract 2016-08-25 08:26:42