尝试运行 svnadmin verify 会导致校验和不匹配
Posted
技术标签:
【中文标题】尝试运行 svnadmin verify 会导致校验和不匹配【英文标题】:Trying to run svnadmin verify results in checksum mismatch 【发布时间】:2013-08-22 13:20:08 【问题描述】:我有一个已有 7 年历史的存储库。为了进行一些维护,我在存储库上运行了svnadmin verify
。我在多个版本中遇到了校验和不匹配错误。
我试图创建一个没有错误修订的转储并重新创建存储库,但是有很多年轻的修订依赖于错误的修订。在此状态下,我无法使用 svnadmin dump
备份我的存储库。
是否有针对这些错误的解决方法以创建存储库转储文件?
【问题讨论】:
【参考方案1】:[我知道它与此问题的其他答案相关联,但 SO 答案不应该真正链接到场外资源,我想这个答案应该比我自己的个人博客网站寿命长,所以发布它这里是为了后代。]
由于逐个版本地重新构建存储库版本总是一个巨大的痛苦,我在存储库的内部做了一些处理来解决这个问题。
症状:
在存储库上运行 svnadmin verify 会导致“读取表示时校验和不匹配”。这里的输出具有误导性,因为它会在错误消息之前的行上显示类似“* Verified revision 23”的内容。这意味着实际上是版本 24 不好。您还会发现,如果您尝试转储存储库,它将成功转储修订版 0 到 23,但随后在 24 失败。如果您尝试转储修订版 0:23,然后像我一样转储 25:HEAD,您可能会发现 25:HEAD 修改不起作用。
诊断:
导致问题的修订版中的一个(或多个)文件更改与当时的修订版文件记录的校验和不同。因此,当 svnadmin verify 查看修订的内容并重新计算校验和时,它发现它们不匹配并告诉您。这意味着两种情况之一:1)当时记录的校验和是错误的,并且修订/文件中的数据是有效的,或者 2)修订/文件中的数据已损坏,并且当时的校验和是正确的.
如果生成错误校验和的文件是文本文件,您可以查看修订文件的内容并检查它是否明显损坏。如果文件和我的一样是二进制文件,那可能不是一个选择。如果文件很大(我的文件是几百 MB),则更是如此。
2) 在我看来更有可能,所以有问题的文件很可能已损坏,您需要修复数据。但是如果 1) 是这种情况,那么您需要做的就是修复校验和。无论哪种方式,您现在都可能无法判断 - 所以最好假设它已经消失并从那里开始工作,或者至少将其视为可疑并在可能的情况下根据其他数据来源对其进行验证。
可能的解决方案:
如果您愿意假设文件已损坏,那么您可以通过更改保存在修订文件中的校验和以匹配将从数据生成的校验和,从而使您的 repo 回到可验证的步骤.数据不会改变,因此您仍然需要手动验证或稍后删除它,但至少您可以说服存储库您不在乎。
流程:
我假设您在这里直接使用 Linux 上的服务器。我使用 Debian,因此通常可以使用 grep 和 hexedit 之类的工具(尽管我必须安装 hexedit)。同样的原则也适用于 Windows,但工具必须改变。
1) 识别损坏的版本。这很简单——它是最后一次成功验证修订后的修订
2) 识别修订版中校验和错误的文件,并在修订版中找到错误校验和。这更难 - 修订文件(存储在 /repository/db/revs 中)是二进制的,在我的情况下是巨大的。但是 grep 是你的朋友。 svnadmin verify 为您提供当前记录的校验和——它存储在修订文件中,紧挨文件描述。这是一个 grep 命令,它会在特定的修订文件中搜索我们得到的校验和:
grep -e "79a1686d0dfb8618b8ccfc9eb7d74759" -A 3 -B 3 -b -a main/db/revs/24
这里引号中的长字符串是 svnadmin verify 给我的“预期”校验和,以下选项说假设文件是二进制文件(-a)
,并在(-B 3)
之前和@之后打印3行上下文987654325@ 每次匹配,关键是每行距文件(-b)
开头的偏移量。这应该输出文件的 7 行(幸好描述文件及其属性的部分大部分是文本)
384989609-id: 5cu.0.r24/384989609
384989633-type: file
384989644-count: 0
384989653:text: 24 75689685 293851064 294285337 79a1686d0dfb8618b8ccfc9eb7d74759
384989724-props: 24 384989543 53 0 113136892f2137aa0116093a524ade0b
384989782-cpath: /path/to/the/bad/file.exe
384989842-copyroot: 0 /
每行开头的数字是偏移量,我们很快就会使用它。 cpath 行是最有趣的——这是您可能会损坏的文件。但这是我们需要更改的 :text: 行以使事情正常进行。如此处所述,(查找有关修订文件格式的部分)该行的格式为“ ”。我们不想更改前 4 个参数——它们很可能就可以了。但是第 5 个参数是错误的校验和,我们将在下一步中使用它。
3) 更改错误校验和以匹配 svnadmin 验证过程提出的“实际”校验和。同样,当您运行验证时会打印出来。为了进行更改,我使用了hexedit,幸好它没有尝试将整个(巨大的)修订文件加载到内存中。您只需启动它,然后按回车键输入要跳转到的文件中的偏移量。它需要十六进制,因此快速转换将384989653
转换为16F279D5
。从那里您可以按 Tab 切换到 ASCII 编辑,快速找到有问题的校验和并用新的有效校验和覆盖它;然后按 Ctrl-X 保存文件并退出。
4) 重新运行 svnadmin 验证。它现在应该成功验证损坏的修订并继续前进。如果不是,请检查它失败的修订和校验和是否相同 - 如果它们不同,那么您有更多损坏的文件/修订,您应该重复步骤 1 到 3,直到它们全部消失。希望他们不会太多。请记住——仅仅因为您的存储库现在可以验证,并不意味着您的数据是有效的。您所做的只是告诉 svnadmin 工具,您拥有的数据的校验和与其期望的校验和相同。
希望这对其他 SVN 管理员有所帮助。
【讨论】:
【参考方案2】:经过一番谷歌搜索,我发现了以下post。 遵循这些指导方针,我能够“修复”错误的修订并完成完整的 svnadmin verify 命令。此外,它还允许我创建存储库的完整转储。
这个解决方案的缺点是它实际上并没有修复坏的版本。它只是让它们干净,以便 SVN 正确处理它们。我假设如果我尝试签出这些修订版中的文件,我可能会遇到错误。
希望对任何人都有帮助。
【讨论】:
是的,我前段时间写过那篇文章,你是对的,你很可能会得到损坏的数据。在我的情况下,不清楚的是 SVN 的校验和是否错误,或者数据本身。如果数据很好但校验和计算错误(无论出于何种原因),那么这些修订并不是“坏的”。但他们肯定是可疑的,需要仔细检查。 SVN 根本没有您需要说明文件是否正常的信息,当然也没有重新创建文件所需的信息。以上是关于尝试运行 svnadmin verify 会导致校验和不匹配的主要内容,如果未能解决你的问题,请参考以下文章
Windows 10 和 Spyder 上的 Python 错误 [SSL: CERTIFICATE_VERIFY_FAILED]