SVN清理:SQLite数据库磁盘映像格式错误。

106

我试图执行 svn cleanup 以清理我的工作副本因为我无法提交更改,但是我遇到了以下错误:

sqllite: 数据库磁盘映像损坏

Cleanup failed to process the following paths

现在我该怎么办?

18个回答

117

首先,在存储库根目录下(具有子文件夹.svn的文件夹)打开命令行/终端:

请按照以上要求进行翻译,以下是翻译内容:

cd /path/to/repository

下载sqlite3,并将可执行文件sqlite3放在文件夹根目录下。

对保存版本库的sqlite数据库(/path/to/repository/.svn/wc.db)进行完整性检查:

sqlite3 .svn/wc.db "pragma integrity_check"

这将会报告一些错误。

然后你可以通过执行以下操作来清理它们:

sqlite3 .svn/wc.db "reindex nodes"
sqlite3 .svn/wc.db "reindex pristine"

如果在这之后还有错误,你仍然可以选择将存储库的新副本检出到临时文件夹并将 .svn 文件夹从新副本复制到旧副本中。然后旧副本应该可以正常工作,您可以删除临时文件夹。


1
你怎么在Windows8命令行中使用sqlite3?(我猜,使用PowerShell?)谢谢! - Fattie
2
我使用的是可以从sqlite网站下载的_sqlite命令行工具_。但我想你也可以使用其他任何sqlite客户端。 - HenningJ
8
奇怪,我收到了“错误:无法识别需要重新索引的对象”的提示。 - Pacerier
1
当我运行第一个命令时,出现了“'sqlite3'不是内部或外部命令”的错误提示。 - aagjalpankaj
4
这个链接http://www.polak.ro/svn-e200030-sqlite-database-disk-image-is-malformed.html似乎永久失效了。 - MadMike
显示剩余5条评论

31

完整性检查

sqlite3 .svn/wc.db "pragma integrity_check"

清理

sqlite3 .svn/wc.db "reindex nodes"
sqlite3 .svn/wc.db "reindex pristine"

或者

您可以将数据库的内容转储到备份文件中,然后将其读入新的数据库文件:

sqlite3 .svn/wc.db

sqlite> .mode insert
sqlite> .output dump_all.sql
sqlite> .dump
sqlite> .exit

mv .svn/wc.db .svn/wc-corrupt.db
sqlite3 .svn/wc.db

sqlite> .read dump_all.sql
sqlite> .exit

2
我没有得到所有的转储内容,但已经足够了。在 SQL 文件中滚动并将最终的 ROLLBACK; 更改为 COMMIT;,然后执行 .read dump_all.sql - Jan Katins
2
这种方法现在似乎失败了,出现错误svn: E235000: In file 'D:\Development\SVN\Releases\TortoiseSVN-1.9.7\ext\subversion\subversion\libsvn_wc\wc_db_wcroot.c' line 311: assertion failed (format >= 1),但是有一个解决方法在这里:http://hanscarpenter.blogspot.com.au/2016/05/subversion-fails-du-to-power-outage.html。 - mpeac
3
修复断言错误的正确方法是:1. 对原始数据库运行 sqlite3 .svn/wc.db 'PRAGMA user_version;' 以获得正确的数字。2. 对具有正确数字的还原版本运行 sqlite3 .svn/wc.db 'PRAGMA user_version = XXX;' - Chronial
据我所知,将所有内容倾倒到一个几乎全新的数据库文件中是“VACUUM”命令的作用。 - blerontin

20

SVN清理没有生效。我的本地系统上的SVN文件夹已经损坏了。所以我只是删除了文件夹,重新创建了一个新的文件夹,并从SVN更新了内容。问题解决了!


16

在一次停电后,我遇到了“数据库磁盘映像格式错误”的错误,并且建议的重新索引节点命令由于违反约束条件未能修复所有问题。此外,http://mail-archives.apache.org/mod_mbox/subversion-users/201111.mbox/%3C874nybhpxi.fsf@stat.home.lan%3E所描述的过程也未能解决问题。

我的解决方法:

  • 将svn仓库再次checkout到一个临时文件夹中
  • 从新的checkout中复制(即替换)“.svn/wc.db”文件至损坏的仓库中

如果原始svn checkout包含许多已修改或未版本化的文件,并且您不想切换到全新的svn checkout,则此方法可能非常有用。


13

我从同事的目录中复制了 .svn 文件夹,这解决了问题。


4
不要浪费时间在检查完整性或从工作队列表中删除数据上,因为这些都是临时解决方案,一段时间后会反弹回来。只需进行另一个检查并使用新的 .svn 文件夹替换现有文件夹。执行更新操作,然后应该会顺利进行。

3
  1. 在另一个地方检出svn
  2. 显示隐藏的.svn文件
  3. 替换wc文件

这对我有用!


2

也许,这可能是一个解决方案:

  1. 在项目上右键单击
  2. 团队 -> 断开连接
  3. 选择:同时删除...

现在,重新连接:

  1. 在项目上右键单击
  2. 团队 -> 共享项目
  3. 选择你的仓库:我的SVN(其他情况:git等)
  4. 选择你的仓库文件夹

注意:

在我的例子中,我备份了我的文件。(保持安全 :P)

编辑:

我在谈论EclipseSVN插件 :)


1

我解决了 Visual SVN Server rep-cache.db 损坏的问题。

有两种解决方案。

停止 Visual SVN Server 服务。

从 sqllite 网站下载 sqllite3.exe shell 并将其复制到 repo 的 db 文件夹中。

在 repo 的 db 文件夹中,在命令提示符下键入以下命令。

-- 第一种解决方案 --

sqlite3 rep-cache.db

.clone rep-cache-new.db

按下 ctrl+c 退出 SQLite。

ren rep-cache.db rep-cache-old.db

ren re-cache-new.db rep-cache.db

“第二种解决方案:删除rep-cache.db文件。”
del rep-cache.db

它将会自动创建。

谢谢穆罕默德——这正是我需要的线索!需要确定问题是在您的工作副本中的sqlite数据库还是服务器上的数据库。尝试在命令行上提交您的提交——如果文件成功传输并且错误发生在“提交事务”时,则问题可能在服务器端。穆罕默德在这里的解决方案非常好用。这个旧的列表档案有更多细节:http://svn.haxx.se/users/archive-2010-12/0257.shtml - powderflask

1

你看过子版本网站上的这篇文章吗?你也可以尝试直接验证和“修复”数据库,就像这里所描述的那样。(请注意,我不是专家,我只是进行了快速的谷歌搜索。可能与你的问题无关)。

个人建议,你可以再次检出仓库并重新应用你的更改。但不确定在你的情况下是否可行?


在我的情况下,这并没有解决问题,反而在Tortoise SVN中引起了更多的错误,只是警告。 - komorra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接