Perforce集成常见问题解答

有关Perforce术语的常见问题和用法详细信息。

Windows
MacOS
Linux

本文档旨在帮助你理解将Perforce与虚幻引擎4配合使用的一些常见用法及相关术语。

为帮助简化合并过程,一个自动合并工具应运而生,可将它集成到P4V和P4Win中。它可以自动执行本文档中介绍的多个繁琐步骤和最佳实践。有关更多信息,请参阅Perforce自动合并 页面。

常见问题解答

在Perforce中,集成、合并和分支的含义是什么?

它们的含义相同,都通过Integrate命令实现。分支通常指的是在新位置创建新文件的集成。合并指的是将两个之前已创建了分支的文件集成起来。

将文件复制过来进行更改即可,为何还要执行这些复杂的步骤?

Perforce会保留由已进行的所有变更和集成组成的可搜索的图形化数据库。"手动"合并会使数据库跟踪记录中断,从而造成无法跟踪代码历史记录,维护分支变得更加困难以及由于有人正确执行了集成给你和Perforce带来更多困扰等问题。问题的症状多种多样,可能是Perforce拒绝集成文件,也可能是要为简单变更执行难得离谱的冲突解决。

如何集成单个变更列表?

强烈建议你在集成时使用P4V,因为其使过程可视化的UI有了很大改进。一切最终都将解析为相同的底层P4API调用,这样,P4V和P4Win都将支持相同的功能集。

要在P4V中集成单个变更:

  • 确保你的活跃工作空间包含要集成到的分支。 * 无需在工作空间中包含源分支。

  • 右键单击要集成的变更列表并选择 使用已提交的变更列表"change#"集成...(Integrate using submitted changelist 'change#'...)。你应看到与下图中所示相似的对话框:

P4VIntegrate.jpg

  • 选择集成方法(Choose integration method) 下,选择 使用分支规范(Use branch specification) 并选择要使用的分支。

  • 如果已删除或重新添加了文件: 单击 高级选项...(Advanced options...) 并单击三角形图标进行分段。 围绕已删除的版本启用集成(Enable integrations around deleted revisions) 下,选择相应的选项。 通常需要 在源被删除时删除目标文件(Delete target file when source is deleted) 除非十分有把握,否则不要选择任何其他选项!

P4IntegrateAdvancedOptions.JPG

  • 一定要使用预览按钮检查错误。如果有错误,你将无法完成集成。 P4V现在支持目视检查集成错误。 你将看到包含所有集成文件的树视图,其中,无法集成的文件以红色突出显示。 你可以使用红色箭头循环访问错误。"说明(Description)"字段将解释每个文件无法集成的具体原因。 你也可在经典的平面视图或较新的树视图间切换。 * 如果自己无法解决错误,请找人帮助你。

P4VPreview.JPG

  • 选择 新建变更列表(New changelist),以确保不会将现有变更与此合并混合起来。

  • 单击 完成(Finish) 以创建新变更列表。

  • 按照下面的说明 解决已集成文件的冲突。

  • 请彻底测试,然后再提交。

  • 请记得使用本指南下文中提到的变更列表说明指导准则

要在P4Win中集成单个变更:

  • 打开 版本历史记录(Revision History)右键单击 要合并的变更列表,然后选择 使用...集成|分支规范(Integrate Using|Branchspec...)

  • 从列表中选择分支规范。

  • 如果已删除或重新添加了文件: 选择 选项...(Options...)|允许删除/重新添加(Permit deletes/re-adds) 请根据需要选中 仅删除(deletes only)仅重新添加(re-adds only),或者同时选中这两个单选按钮。 * 除非十分有把握,否则不要选择任何其他选项!

  • P4Win不提供可用于预览的可视化工具,因此,你需要阅读输出窗口中的文本。 * 如果遇到问题,请找人帮助你。

  • 选择 新建变更列表(New changelist),以确保不会将现有变更与此合并混合起来

  • 单击 完成(Finish) 以创建新变更列表

  • 按照下面的说明 解决已集成文件的冲突。

  • 请彻底测试,然后再提交。

  • 请记得使用本指南下文中提到的变更列表说明指导准则

要快速解决文件冲突,最安全的方法是什么?

签入前,必须要为每个要集成的文件解决冲突。对于棘手的冲突,有时需要寻求原提交者的帮助。为了简化该过程,Perforce提供了多个选项,可用于自动解决简单合并的冲突,以缩短列表长度。P4V和P4Win都提供这些选项。向前推进的最安全方法是遵循以下顺序: 1. 安全自动解决冲突(Safe Automatic Resolve) - 如果自上次合并以来,文件仅在一个分支中发生了变更,则自动解决变更冲突。这始终是安全的方式,因为它可以直接将发生变更的文件复制过来。 1. 自动解决冲突(Automatic resolve) - 如果文件在两个分支中都发生变更但不存在冲突,则解决变更冲突。 1. 交互解决冲突(Interactive resolve) - 任何剩下的文件都是难以处理的文件,在两个分支中发生的变更彼此冲突。

* 要处理这些文件,你需要使用合并工具,例如:
    * [Araxis Merge](http://www.araxis.com/) 或 
    * P4WinMerge。

P4VResolve.jpg

注:

  • 安全自动解决冲突(Safe Automatic Resolve)通常可自动解决大部分文件的冲突。

  • 使用交互方式合并文件时请格外小心,并在需要时寻求帮助!

剩下的文件都是在两个分支中都发生了变更的文件。

P4V将显示它发现的变更和冲突的摘要总数并提供一系列协助工具(打开、对比、历史记录、时间间隔)。

P4VResolveIndividual.jpg

准备就绪之后,单击 运行合并工具(Run Merge Tool) 运行已注册的合并工具,以执行实际合并。推荐使用P4V的内置合并工具,因为它提供4路窗格,始终显示源、基本、目标和合并后的结果,并使用颜色将每个变更的源标记出来。很多其他合并工具(例如,Araxis)仅显示3个窗格,因此基本版本会在你执行合并时被覆盖。有关P4Merge使用的颜色/图标方案的更多详细信息,请参阅P4Merge帮助查看器(合并时按F1键)。

P4VMerge.jpg

在所有文件的冲突都解决之后,你就可以提交变更了。

完成集成时,我应该在签入注释中填写什么?

虽然从技术上来说,Perforce在其内部数据库中跟踪集成,但是在注释中表明你的意图有助于其他人员了解此变更源自不同的分支。

在你签入时:

  • 添加一句话,简单陈述集成的代码以及它在变更列表中的范围。理想情况下,应在每次提交时集成单个变更列表。在单次提交中将多个要集成的变更列表混合在一起将增大后续解决合并问题的难度。

  • 为减轻每个人的负担,重新总结要进行的变更和所有修改。如果别无他法,从原变更列表复制它们,然后粘贴即可!

我有多个变更需要集成。我可以一次性将它们全部集成吗?

请不要这样做。单独提交每个要集成的变更列表会更好。尽管你可以一次性集成多个变更列表,但不建议你这样做。因为这样做可能会使合并过程变得异常困难,尤其在同一个文件存在重叠变更的情况下。而且,如果你多次集成一个文件但未签入,你无法在发现问题时撤消单个集成。

我的一个合并非常棘手,几乎无法解决冲突。我应该手动执行合并吗?

你仍应该执行集成,以使Perforce数据库了解该变更已被集成。你应该照常执行集成,但是在解决冲突阶段,你应该"接受你自己的版本"。这样做不会使本地文件更改,但是可告知Perforce那些文件已被集成。

然后,在签入前,你应该重新打开相应的文件进行编辑并在新代码中进行所需变更。这样,你就创建了表示将该变更集成到开发分支的集成的单个变更列表。

在我关注的变更列表提交后,某个文件在源分支或目标分支中都发生了多个变更。是否可以合并此变更?

一般来讲是可以的,应该没有什么问题。即使文件被大幅更改甚至被删除,因为更改是在源分支中进行的,如果遵循上述说明进行操作,Perforce将仅集成那些你感兴趣的变更。当然,变更列表越旧,在目标分支中需要处理合并冲突的可能性就越高。

是否存在我应集成一个文件或一系列文件而非变更列表的情况?

除非有很好的理由,否则不建议你这样做。执行集成时,你应始终遵循如下顺序:选择单个变更列表,将它集成过来,测试它,最后提交它。如果直接集成文件,你会合并源分支中该文件的所有尚未集成的变更!这意味着你可能会将不需要的变更或依赖不存在的代码的变更引入目标分支。通过仅合并需要的变更列表,可以避免这一问题。

完成时,我是否应该恢复我未变更的文件?

否。你应该始终签入从变更列表集成的所有文件。即使文件未变更,签入它也会使Perforce数据库中的集成信息更新。

Perforce按文件存储集成历史记录,而非按变更列表。如果你在集成变更列表之后恢复了部分文件,这将增大分析数据库的难度,因为某些变更列表会被列入仅被部分集成的类别。

我确定不应集成某个变更列表。我是否需要执行任何操作?

这被称为NULL合并。如果你完全肯定你提交的某个变更永远不会被其他分支需要,继续操作并执行NULL合并通常非常有用。要执行NULL合并,集成文件,然后在解决冲突时选择"接受你自己的版本"。这将创建一个正式记录:该特定变更已被某人检查但未针对它执行任何操作。这将简化维护该分支的人员的工作流程,因为该变更不会被包含在待集成到该分支的变更列表中。

这是否必要取决于该开发分支的策略以及管理集成的方式,因此你应联系该开发分支的负责人并确认是否应对你的变更执行该操作。

执行NULL合并时,应在签入说明中提及变更列表编号以及它为NULL集成的事实,以免为之后的集成记录分析带来困扰。

我希望进行集成的方向与分支设置相反。我应如何实现这一目的?

应该已设置了分支规范,常规变更流会被作为默认方向。此设置通常应在合并分支或弃用分支时进行。

Perforce支持在集成过程中"颠倒"分支规范:

  • 在P4V中,你只需单击"选择分支规范(Select branch specification)"部分中的绿色箭头即可。请参阅集成项 中的屏幕截图 。 * 该处还有文本,以防你忘记。

  • P4Win似乎可以自动检测颠倒请求。 * 只需使用相同的分支规范集成变更列表即可,它将自动决定是否应该颠倒映射方向。

我正在尝试集成针对一些文件的变更,而这些文件在目标分支中不应存在。我该怎么办?

应该更新分支规范,以将这些文件从集成中排除。联系分支规范所有者,拜托他们取消映射这些文件。

通常当发生这种情况时,Perforce会执行以下一种或两种操作: 1. 提供它无法执行没有-d或-dt标记的集成的警告。 1. 它将执行该集成并尝试为这些新文件创建分支。

* 尽管你可以添加-d来使集成强制执行,然后在签入前恢复这些文件,但是强烈反对你这样做,原因有二:
    1.易于出现错误。在发现问题时修改分支规范可确保你或者你之后的其他任何人不会意外添加这些文件。 
    1.它无法与Perforce集成数据库兼容,因为Perforce将始终认为该变更列表中仍有需要集成的文件。

例如,Delta-To-Main分支(Gears PC)中拥有WarGame文件夹,而只有Delta需要该文件夹,WarGame被从Main中删除。当尝试集成包含WarGame中的某个文件的变更时,Perforce将表示它需要-d或-dt选项才能集成"已删除的版本"。要解决这一问题,应从Delta-To-Main分支规范中删除WarGame,这样,Perforce将不再尝试集成这些文件。

Select Skin
Light
Dark

Welcome to the new Unreal Engine 4 Documentation site!

We're working on lots of new features including a feedback system so you can tell us how we are doing. It's not quite ready for use in the wild yet, so head over to the Documentation Feedback forum to tell us about this page or call out any issues you are encountering in the meantime.

We'll be sure to let you know when the new system is up and running.

Post Feedback