将存储库从 Windows 迁移到 Linux 时出现格式错误的转储文件头(编码问题?)

Posted

技术标签:

【中文标题】将存储库从 Windows 迁移到 Linux 时出现格式错误的转储文件头(编码问题?)【英文标题】:Malformed dumpfile header when migrating repository from Windows to Linux (encoding issue?) 【发布时间】:2013-09-16 00:26:25 【问题描述】:

我正在将 SVN 存储库从 Windows 机器 (Windows 7) 移动到 Linux 机器 (Ubuntu 13)。我使用svnadmin dump 在Windows 上转储repo 并将文件复制到Linux 机器上。现在我在跑步

svnadmin load dest-folder < dumpfile

终端响应

'vnadmin: E140001: Malformed dumpfile header 'SVN-fs-dump-format-version: 2

我怀疑我的字符编码存在问题(Windows 与 Unix),基于单引号从行尾(应该在哪里)到开头的事实。但我尝试在 Notepad++ 中转换字符编码,但我只收到不同的错误。

当我以 UTF-8 编码时出现上述错误。

当转换为“UTF-8 without BOM”或“ANSI”时:

' into a number04: Could not convert ' 2

当转换为“UCS-2 Big Endian”或“UCS-2 Little Endian”时:

svnadmin: E140001: Malformed dumpfile header '?\254?\255'

我对字符编码一无所知,所以我不知道下一步该去哪里。或者可能是我的转储或回购有问题,但到目前为止我还没有遇到任何 SVN 问题。

【问题讨论】:

你是如何将转储从一台机器转移到另一台机器的?你不是偶然使用普通的FTP吗?我怀疑如果您以这种方式发送了一个未压缩的转储文件,并且如果您没有将传输模式切换到binary,则该文件在飞行中损坏了。我会再次转储,或者,如果您有足够新的 svn 客户端,只需从客户端运行 svnrdump 当然,您绝不能尝试对转储文件进行任何编码转换:它应该是不透明的!唯一有意义的问题可能是 BOM 标记和/或 EOL 序列。以防万一,我刚刚在 Windows 上使用 Subversion 1.8.0 运行了一个svnrdump,它生成了一个带有LF 仅 EOL 的转储文件;该文件是 UTF-8,没有 BOM。 哦,顺便说一句,您在生成和保存转储文件时不是使用 PowerShell 吗? AFAIK,它的作者是白痴,并将 UCS-2 输出到管道或 shell 重定向文件中——例如,参见 this,一般参见 this。 @kostix:我使用闪存驱动器复制了文件。如果我根本不编辑文件并尝试按原样使用,我会收到上面显示的第一个错误。最后,我开始使用命令提示符并切换到 PowerShell。这可能是我的问题,我今天会尝试并回复。 【参考方案1】:

这个答案来自用户 kostix 对我的问题的 cmets。

问题是我使用 PowerShell 创建转储文件。当我切换到在 Windows 中使用 vanilla 命令提示符时,问题就解决了。正如所指出的,PowerShell 通过管道或 shell 输出文件自动输出 UCS-2 文件,而 Linux 不喜欢这种字符编码。

【讨论】:

这不是“Linux 不喜欢这种编码”——而是 Subversion 期望其转储以 UTF-8 编码,无论它是哪个平台。 有没有简单的方法将文件转换为UTF-8? 我用的是记事本++。它允许您在保存之前即时切换编码。 我使用了 visualsvn powershell 工具来迭代我需要的存储库并在它们上运行包括转储在内的工作流。将命令和输出包装在 .bat 文件中似乎有帮助。它也比以前快了几个数量级。 有趣的是,这帮助我解决了相反的情况:在 linux 上转储,在 Windows (VisualSVN) 中加载。起初我尝试了 PowerShell Get-Content(而不是“cat”)并得到了一个错误。但是带有类型命令的旧 cmd.exe 可以通过管道传输到 svnadmin load 中。【参考方案2】:

如果您收到错误 svnadmin: E140001: Malformed dumpfile header '?\FF?\FES'

如果您使用 PowerShell 进行备份,Windows SVN 转储在 Linux SVN 上不起作用,我建议在 Windows 中使用 vanilla 命令提示符(默认),它会比 PowerShell 快 10 倍以及进行转储备份。

svnadmin dump /repository_name > backup_svn.dump

【讨论】:

以上是关于将存储库从 Windows 迁移到 Linux 时出现格式错误的转储文件头(编码问题?)的主要内容,如果未能解决你的问题,请参考以下文章

移动了存储库。我是否使用SVN交换机,SVN重定位或其他所有内容

迁移存储库时 SVN 校验和不匹配

Windows下从SVN导入Git时如何添加空文件夹?

将代码从 svn 迁移到 google 代码

使用 pg_dump 将 Postgres 从 Windows 迁移到 Linux 时如何选择正确的排序规则来创建数据库?

svn 迁移但转储存储库的一部分