Perforce:从 Windows 到 Linux 的交叉迁移无法重放检查点

Perforce: Cross-Migration from Windows to Linux fails to replay checkpoint

我正在尝试将我的个人 Perforce 服务器从 Windows 迁移到 Linux (Ubuntu 20.04),但是我无法从 Windows 重放检查点文件Linux服务器上的服务器。

我想继承 Linux 的案例处理,根据 Perforces 的文档,使用 p4migrate 工具应该可以实现。我已经在 Linux 服务器上安装了该工具,并严格按照文档中的步骤操作(此时已多次),但仍然 运行 出现以下错误。

注意,使用p4migrate创建编辑后的checkpoint文件时,报错issues/conflicts。在第一次尝试时,它还成功地重命名了所有存档文件以匹配 Linux 的案例处理(并且我已经更改了行尾)。

这只是它似乎无法恢复的数据库。我正在使用以下命令从 p4migrate 创建的检查点文件重建数据库:

p4d -r /mnt/Disk/PerforceServer/root -jr checkpoint.4.edited

但是这样做会产生以下输出:

Perforce db files in '/mnt/Disk/PerforceServer/root' will be created if missing...
Recovering from checkpoint.4.edited...
Perforce server error:
    Journal file 'checkpoint.4.edited' replay failed at line 5145!
    Case-handling mismatch: server uses Unix-style (-C0) but journal flags are Windows-style (-C1)!

我做了几次尝试,但结果总是一样。它创建所有的 .db 文件,但随后几乎立即停止。我自然地检查了它报告的行,并用细齿梳检查了检查点文件(大约 45mb),但没有发现任何问题。

我怀疑这里有其他问题,但似乎没有办法获得更详细的日志记录。有没有人 运行 以前解决过这个问题并找到了解决方案?

附录:我还有 运行 p4d -jv checkpoint。4.edited 只报告了以下内容:trailer found on line 196624(文件结尾)

经过一周的脱发经历,我终于能够获得解决问题所需的信息。首先要注意的是,上面给出的错误完全是误导性的。实际上,它提到的检查点文件没有问题,这纯粹是个案处理问题。我不知道为什么它会将该行作为错误吐出来,但这与它无关。

提醒一下,我正在运行将Windows服务器转移到Linux服务器(Ubuntu 20.04),我使用的是Perforce 20.3版。您必须确保源机器和目标机器上的两个版本相同。我通过更新 windows 服务器解决了这个问题,然后 运行 使用 p4d -xU 命令升级数据库。

我的目标也是 运行 区分大小写 服务器 Linux。 Perforce 提供了 p4migrate 工具来支持这个 t运行sition,但至少根据我目前的经验,该工具有几个错误并且文档包含一两个错误。我会将我的发现转发给 P4,希望他们能修复它,当然,除非我非常不幸。

解决方案:

您需要按照 p4migrate 文档中的所有步骤进行操作 直到并包括 第 4 步。第 5 步开始有所不同。问题是 p4migrate 似乎并没有真正改变检查点文件中的案例处理方法,所以你必须手动设置它。我不确定这是否是一个错误,但这解决了案例 mismatch/BTree 问题并成功重播检查点。

可以通过调整第一个@nx@ 条目(对我来说是检查点文件的第一行)来手动更改案例处理方法。第五个字段表示它。 1 = 区分大小写,2 = 不区分大小写。要将检查点更改为区分大小写,请执行以下操作:

    @nx@ 0 1610070027 @51@ 2 0 0 0 0 @/path/to/root@ @journal@ @@ @@ @@

Changes to:

    @nx@ 0 1610070027 @51@ 1 0 0 0 0 @/path/to/root@ @journal@ @@ @@ @@

需要注意的是,我对 p4migrate 的输入 输出文件都进行了此操作。即使在编辑了输入检查点之后,p4migrate 仍然输出了一个不区分大小写的检查点(也许这是因为我没有要解决的冲突)。完成此操作后,继续执行其余步骤,包括第 10 步。我在此步骤中用于重播检查点的命令如下:

p4d -r /Folder1/Folder2/PerforceServer/root/ -jr checkpoint.n.edited

然后您可以启动区分大小写的服务器。请注意,我 运行 p4 verify -q //... 反对的每个文件在此阶段都返回 BAD! 警告,但我没有 MISSING! 警告。如文档所述,您现在可以忽略 BAD! 警告。

最后,步骤 11 中显示的命令似乎有 两个 版本。来自 p4migrate documentation.

的那个
find $P4ROOT -type f \( -name "*,v" -o -name ".*,v" \) -print \
    -exec perl -p -i -e 's/\r\n/\n/' \{} \;

还有来自 Cross-Platform Migration knowledgebase article 的那个。

find . -type f -name '*,v' -print -exec perl -p -i -e 's/\r\n/\n/g' {} \;

注意细微差别。我不是 Linux/Perl 专家 - 但 p4migrate 文档中缺少的 'g' 提示我那里有错字。结果,我 运行 每个软件仓库的这个版本的命令,只是为了明确:

find /folder/anotherfolder/Depot1/ -type f -name '*,v' -print -exec perl -p -i -e 's/\r\n/\n/g' {} \;
find /folder/anotherfolder/Depot2/ -type f -name '*,v' -print -exec perl -p -i -e 's/\r\n/\n/g' {} \;

等...

然后我再次运行p4 verify -q //...(第12步),它没有返回任何错误!现在您需要做的就是使用 p4dctl 启动一个区分大小写的 Perforce 服务,您就可以离开了。同步再次工作,我什至不必手动强制 p4 verify 来更新 MD5 校验和。希望这对遇到此问题的其他人有所帮助。