修复损坏的SVN存储库

Nor*_*ren 8 svn version-control

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

具体错误是:

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

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

任何有关如何进行的建议将不胜感激.

Dav*_* W. 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
Run Code Online (Sandbox Code Playgroud)

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

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

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


bek*_*kce 5

您应该按照David W.的建议进行转储和加载。但是,我遇到了一些陷阱,我想发布一个完整的解决方案。

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

首先,我们将通过删除匹配的行来尝试禁用校验和计算 Text-content-md5

svnadmin dump my_repo | sed '/^Text-content-md5/d' | svnadmin load second_repo
Run Code Online (Sandbox Code Playgroud)

渐进式方法使我们能够纠正错误并继续前进。如果在转储和加载过程中发生错误,请查找最后--- Committed revision X >>> ---一条消息,并将X + 1作为起始修订版作为参数-r并重试。这样可以节省大量时间。

svnadmin dump --incremental -r1:100000 my_repo | sed '/^Text-content-md5/d' | svnadmin load second_repo
Run Code Online (Sandbox Code Playgroud)

或者只是从转储文件加载:

sed '/^Text-content-md5/d' dumpfile.txt | svnadmin load second_repo
Run Code Online (Sandbox Code Playgroud)

如果这还不够,并且出现“ 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
Run Code Online (Sandbox Code Playgroud)

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

额外的信息:

  • 您可以附加--bypass-prop-validationsvnadmin load命令。如果损坏较小,则可以使用。
  • 修正Dump stream contains a malformed header (with no ':') 误差追加
    | grep --binary-files=text -v '^* Dumped revision'
    (前到管链svnadmin load)。

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