svnadmin:Svndiff包含一个太大的窗口

时间:2010-09-17 09:11:40

标签: svn svnadmin

当我尝试加载/恢复我的SVN存储库时,我收到错误:

  

svnadmin:Svndiff包含一个太大的窗口

我该如何解决这个问题?

2 个答案:

答案 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的视频文件 - 那么您需要以某种方式修改它以更改散列。如果您正在使用可执行文件,情况会变得更糟,因为这些都很难在编辑后进行修改。

我的建议如下:

  • 如果是基于文本的文件,请尝试提供整容机会(例如,空白评论,额外换行等)。
  • 如果是可执行二进制文件,请尝试重新编译它。
  • 对于所有其他二进制文件(图像,视频等),您需要巧妙地修改它。

我希望这有一定的帮助,这是一个真正痛苦的问题。