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 软件仓库未显示在客户端上