正如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
如果不够了解,你可能会遇到'Premature end of content data in 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
命令。
- 通过在管道链中(在
svnadmin load
之前)添加
| grep --binary-files=text -v '^* Dumped revision'
来修复
Dump stream contains a malformed header (with no ':')
错误。
希望这篇文章对一些人有用。
svnadmin
dump and load 命令,看看是否能解决损坏问题。 - David W.dump
命令中,你可以通过-r
参数指定一个版本范围。尝试跳过错误的版本,看看是否有帮助。如果你有备份,你可能可以从备份中进行一次 dump,然后开始对当前版本进行 dump,直到备份之后的版本。然后,将两个 dump 文件合并起来,看看会发生什么。除此之外,你没有太多选择。这就像硬盘崩溃时会发生的情况。你尽力挽救能挽救的,希望一切都能好起来。 - David W.svnadmin dump
范围,我能够保留一些历史记录和最新的修订版本。请发布一个答案帖子,这样我就可以关闭该线程。谢谢! - Noren