如何修复我的 TortoiseSVN 存储库中的损坏?

Posted

技术标签:

【中文标题】如何修复我的 TortoiseSVN 存储库中的损坏?【英文标题】:How Can I Fix Corruption In My TortoiseSVN Repository? 【发布时间】:2020-04-22 03:09:08 【问题描述】:

上个月,我们在 TortoiseSVN 上正常工作,但在尝试提交/更新一个或两个不常访问或更新的特定文件夹时开始收到错误消息。混合了“尝试在文件开头之前设置文件指针”。和“sqllite[S8]:尝试写入只读数据库。”错误。清理并没有修复它们。

我们认为该问题是由某个时候的磁盘故障引起的,但由于这些问题仅发生在这几个文件夹中,因此我们没有足够远的备份来真正解决它。自那时以来,我们还有近 1000 次提交。经过一些研究,我认为最好的方法是将所有有效的修订转储到一个新的存储库,并在事后从错误的修订中放回文件中。

我已遵循此链接中的建议:https://spin.atomicobject.com/2015/10/06/svn-corruption-recovery/

以下是我使用过的命令行 svnadmin 命令。 D:\SVN 是我们存储库的位置。

检查错误的修订:

svnadmin verify D:\SVN --keep-going

输出以下错误:

r33809: E140001: zlib <uncompress>: corupt data: Decompression of snvdiff data failed
r34866: E720131: Can't set position pointer in file D:\SVN\db\revs\34\34866': An attempt was made to move the file pointer before the beginning of the file.
r34892: E160004: Reading one svndiff window read beyond the end of the representation.
svnadmin: E205012: Failed to verify repository 'D:\SVN'

根据我的阅读,我不能使用 svndumpfilter 排除这些错误的修订,我需要做的是在输出到转储文件时跳过错误的修订和完全跟随它的修订。 基于此,以下是我创建的转储:

svnadmin dump D:\SVN -r 1:33800 > tortoisedump.txt
svnadmin dump D:\SVN -r 33801:33808 --incremental > tortoisedump33801-33808.txt

(Skipping 33809 and 33810)
svnadmin dump D:\SVN -r 33811:34808 --incremental > tortoisedump33811-34808.txt
svnadmin dump D:\SVN -r 34811:34865 --incremental > tortoisedump34811-34865.txt

(Skipping 34866 and 34867)
svnadmin dump D:\SVN -r 34868:34891 --incremental > tortoisedump34868-34891.txt

(Skipping 34892 and 34893)
svnadmin dump D:\SVN -r 34894:34997 --incremental > tortoisedump34894-34997.txt

(34998 showed as corrupt at one point, but not in my latest verify check. Excluded 34998 and 34999 for safety anyway)
svnadmin dump D:\SVN -r 35000:HEAD --incremental > tortoisedump35000-HEAD.txt

现在我创建一个名为 SVN2020 的新存储库

svnadmin create SVN2020

最后,我尝试将我的转储加载到新的存储库中。这些运行没有问题:

svnadmin load D:\SVN2020 < tortoisedump.txt 
svnadmin load D:\SVN2020 < tortoisedump33811-34808.txt

但是,这是我的问题开始的地方。当我运行以下命令时:

svnadmin dump D:\SVN -r 33811:34808 > tortoisedump33811-34808.txt

我收到此错误,其中 gp_CheckInventoryTransactions_sel.sql 只是此提交中添加的一个新文件

<<<Started new transaction, based on original revision 33811 
* editing path : trunk/Database/Company/Stored Procedures/gp_CheckInventoryTransactions_sel.sql 
...svnadmin: E160013: File not foundL transaction '33808-q35', path '/trunk/Database/Company/Stored Procedures/gp_CheckInventoryTransactions_sel.sql'

有人对如何继续有任何建议吗?

非常感谢!

【问题讨论】:

【参考方案1】:

我刚刚得到错误

读取一个 svndiff 窗口,读取超出表示的末尾

在 Windows 文件资源管理器中使用 TortoiseSVN 更新 SVN 目录时。

我通过以下方式修复它:

找到损坏的目录(错误前更新的最后一个目录/文件)。 使用 SVN 导出,制作错误目录的副本(或从其他没有 .svn 文件夹的地方获取副本)。 使用 SVN 命令,删除错误目录并提交更改。 将备份的目录复制回原来的位置。 使用 SVN 命令,将目录添加到您的 SVN 结构中。 提交更改。

完成!

不知道这个错误是什么意思。

【讨论】:

以上是关于如何修复我的 TortoiseSVN 存储库中的损坏?的主要内容,如果未能解决你的问题,请参考以下文章

从 SVN 存储库中删除文件而不删除本地副本

Tortoisesvn 跳过记录合并信息

如何在 TortoiseSVN 中取消忽略文件?

TortoiseSVN通过visual Studio提交不运行hook-script

如何修复 Time4J 库中的 NoSuchMethodError?

如何在 TortoiseSVN 中更改用户