修复损坏的SVN存储库

时间:2012-01-12 20:26:38

标签: svn version-control

我在Mac OS X Lion(10.7.2 11C74)上使用svnX(0.9.13),而且我认为它似乎是一个损坏的SVN存储库。我在网站上搜索了类似的问题并found一个couple,但没有一个描述当您无法从存储库中完成结帐时如何恢复。我也没有最新的工作目录。

具体错误是:

  

svn:读取表示时校验和不匹配:
  预期:[哈希]
  实际:[不同哈希]

如果警报被取消(唯一选项),结帐将一直持续到结束。乍一看,大多数文件似乎都存在,但是当我运行应用程序时,很明显有一个版本的混杂。存储库位于USB闪存驱动器上,这可能是腐败的根源。我是唯一访问这些文件的用户,他们在一周内没有被触及并处于工作状态。

有关如何继续的任何建议将不胜感激。

2 个答案:

答案 0 :(得分:16)

当您有一个损坏的存储库时,您保存信息的唯一真正机会是进行转储和加载。如果你很幸运,进行转储和加载有时会纠正腐败。

如果没有,您可以使用转储上的-r <from>:<to>参数来跳过错误的修订。您可以创建多个转储文件并将它们合并到一个存储库中,这样您就可以跳过错误的修订版号。我注意到每个转储文件都以该版本的存储库的完整版本开头,转储/加载过程通常足够聪明,不会使更改加倍。

事实上,我相信您甚至可以将多个转储放入单个转储文件中而不会出现太多问题。以下内容应跳过修订版1001和1204,这些版本是错误的修订版:

$ svnadmin dump -r1:1000 my_repos > dumpfile.txt
$ svnadmin dump --incremental -r1002:1203 my_repos >> dumpfile.txt
$ svnadmin dump --incremental -r1205:HEAD my_repos >> dumpfile.txt
$ svnadmin load my_repos2 < dumpfile.txt

有几个Subversion备份脚本通过转储最新版本来备份存储库。例如,第一次运行它时,它会转储从第一个版本到最后一个版本的所有内容(比如修订版1000)。然后,第二天它将修订版1001转储到最后一个修订版(比如说1003),第二天转发修订版1004到最后修订版。

要恢复,您必须恢复所有转储,但假设备份时间比每次执行完全转储要短。

您也可以进行热门复制,但我发现进行热拷贝的速度比进行转储要快得多,如果必须将存储库移动到其他计算机,则可能会出现问题。

答案 1 :(得分:4)

你应该像David W.建议的那样进行转储和加载。然而,我遇到了一些问题,我想发布一个完整的解决方案。

在某些修订版中,损坏通常发生在单个文件中。我们不需要因为某个文件的校验和不匹配而丢弃整个修订版。

首先,我们将尝试通过删除与Text-content-md5

匹配的行来禁用校验和计算
svnadmin dump my_repo | sed '/^Text-content-md5/d' | svnadmin load second_repo

增量方法使我们能够修复错误并继续我们的进展。如果在转储和加载期间发生错误,请查找最后一条--- Committed revision X >>> ---消息,并将X + 1作为参数-r的起始修订版,然后重试。这节省了大量时间。

svnadmin dump --incremental -r1:100000 my_repo | sed '/^Text-content-md5/d' | svnadmin load second_repo

或者只是从dumpfile加载:

sed '/^Text-content-md5/d' dumpfile.txt | svnadmin load second_repo

如果这还不够,并且您收到“dumpstream中的内容数据过早结束”错误或类似内容,则应该svndumpfilter完全从转储中排除该文件:

svnadmin dump --incremental -r1:100000 my_repo | svndumpfilter exclude myproject/lib/thirdparty-all.jar | sed '/^Text-content-md5/d' | svnadmin load second_repo

上面的命令会从转储中排除myproject/lib/thirdparty-all.jar文件。

额外信息:

  • 您可以将--bypass-prop-validation附加到svnadmin load命令。如果腐败很小,这种方法就有效。
  • 修复Dump stream contains a malformed header (with no ':') 附加的错误 | grep --binary-files=text -v '^* Dumped revision'
    到管道链(svnadmin load之前)。

希望这篇文章对某些人有用。