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

Posted

技术标签:

【中文标题】Perforce:从 Windows 到 Linux 的交叉迁移无法重放检查点【英文标题】:Perforce: Cross-Migration from Windows to Linux fails to replay checkpoint 【发布时间】:2021-04-11 14:57:29 【问题描述】:

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

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

请注意,当使用 p4migrate 创建编辑的检查点文件时,它报告没有报告的案例问题/冲突。在第一次尝试时,它还成功地重命名了所有存档文件以匹配 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(文件末尾)

【问题讨论】:

这听起来像是在第 5145 行的检查点中,将检查点编码为不区分大小写。您能否在问题中包含该行?了解所涉及的 P4D 版本也很有帮助。 @Samwise 这是第 5145 行,与文件中的大多数其他行几乎相同。上次发生这种情况时使用了不同的检查点文件,它在不同的行上中断,但仍然在 ~5000 行附近。 @pv@ 0 @db.integed@ @//Stormtide/HTGame/HTGame/Plugins/ST_Inventory/Source/ST_Inventory/Private/Components/ST_InventoryComponent.cpp@ @//Stormtide/HTGame/HTGame/Plugins/ST_Inventory/Source/ST_Inventory/Private/Inventory/ST_InventoryComponent.cpp@ 0 1 8 9 15 1147 我正在使用每个平台可用的最新版本(Windows 上为 2020.2.205.7778) 【参考方案1】:

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

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

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

解决方案:

您将需要遵循 p4migrate 文档中的所有步骤直到并包括第 4 步。第 5 步是事情开始不同的地方。问题是 p4migrate 似乎并没有真正改变检查点文件中的案例处理方法,所以你必须手动设置它。我不确定这是否是一个错误,但这解决了大小写不匹配/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 校验和。希望这可以帮助其他偶然发现此问题的人。

【讨论】:

以上是关于Perforce:从 Windows 到 Linux 的交叉迁移无法重放检查点的主要内容,如果未能解决你的问题,请参考以下文章

使用 p4 zip 和 unzip 将文件从一台 perforce 服务器导出到另一台

Perforce(AWZ 服务器 Lightsail Windows 实例) - 虚幻引擎源代码控制 - 移动 Perforce 仓库

使用 p4 软件仓库的 perforce 软件仓库未显示在客户端上

如何将更改从主分支中的待处理更改列表迁移到 perforce 中的另一个分支

如何管道密码到perforce p4登录命令进行自动登录?

Perforce 超级用户丢失