当我尝试加载/恢复我的SVN存储库时,我收到错误:
svnadmin:Svndiff包含一个太大的窗口
我该如何解决这个问题?
答案 0 :(得分:4)
因为我今天遇到了这个......
使用FSFS数据库的svn存储库中可能存在损坏的修订版。
备份你的SVN存储。
通过阅读$ {REPO} / db / format
确定您的存储库是否打包/分片[root@chi2 db]# cat format
4
layout linear
如果您的fsfs数据库是'layout sharded',您需要从此处获取fsfs-reshard.py: http://ymartin59.free.fr/wordpress/wp-content/2010/07/fsfs-reshard.py
(这个版本适用于1.6+以上的存储库,这个人的补丁仍然没有被移植到svn trunk)。
运行以下命令解压缩存储库:
./ fsfs-reshard.py $ {REPO} 0
运行验证:
svnadmin verify ${REPO}
* Verified revision 13689.
* Verified revision 13690.
* Verified revision 13691.
svnadmin: E185001: Svndiff contains a too-large window
错误的修订版本是修订版1,大于上次验证的版本,我们的错误版本是13692。
从Subversion trunk获取fsfsverify.py。 http://svn.apache.org/repos/asf/subversion/trunk/contrib/server-side/fsfsverify.py
在错误的修订版上运行fsfsverify.py。您可能需要运行-f选项两次或更多次。这将吐出大量数据,但最终应该清理干净。
[root@chi2 archive]# ./fsfsverify.py -f ${REPO}/db/revs/13692
Copy 4640123 bytes from offset 1006867
Write 4640123 bytes at offset 1003542
Fixed? :-) Re-run fsfsverify without the -f option
[root@chi2 archive]# ./fsfsverify.py ${REPO}/db/revs/13692
再次运行svnadmin verify。对任何进一步的错误修订重复上述过程。
拥有经过验证的存储库后,您可以通过运行
重新打包./fsfs-reshard.py ${REPO} 1000
再次运行svnadmin验证!
您的SVN存储库应该没问题!
答案 1 :(得分:0)
我找到了这个问题的原因,这可能反过来能够帮助你解决它 - 虽然这很大程度上取决于你在存储库中的文件类型。
SVN中的文件按名称和文件哈希记录(我相信它们是MD5)。如果您删除该文件,然后尝试再次上传相同的文件,SVN 会记住哈希值,而不是创建新的基本增量文件,它将指向它存在的先前修订版。
在您的存储库生命周期的某个时刻,您的文件已“中毒”。任何与文件的MD5匹配的文件(无论提交路径如何)都将使svndiff进程失败(原因仍然不完全清楚)因为SVN尝试使用旧的和破坏的修订版。如果要“修复”问题,请在本地修改文件(如果是代码,请尝试添加空白注释),这将导致MD5更改。删除文件并提交新的“固定”版本后,服务应该恢复正常。
现在,回到我的第一段 - 这个解决方案只能用于你能负担得起的文件。例如,如果您有一个100MB的视频文件 - 那么您需要以某种方式修改它以更改散列。如果您正在使用可执行文件,情况会变得更糟,因为这些都很难在编辑后进行修改。
我的建议如下:
我希望这有一定的帮助,这是一个真正痛苦的问题。