175

那里有很多“Git for Perforce users”文档,但似乎很少有相反的内容。

我以前只使用过 Git,最近开始了一份我必须经常使用 Perforce 的工作,并且发现自己很多时候都感到非常困惑。我习惯于 Git 的概念似乎根本无法映射到 Perforce。

有没有人有兴趣为习惯 Git 的人整理一些使用 Perforce 的技巧?

4

3 回答 3

335

在过去的几周里,我一直在做这件事。它仍在发展,但它可能会有所帮助。请注意,我是 Perforce 的员工。

面向 Git 用户的 Perforce 简介

说从 Git 迁移到 Perforce 或从 Perforce 迁移到 Git 并非易事,这是一种轻描淡写的说法。作为表面上做同样事情的两个工具,他们的方法不可能有更大的不同。这篇简短的文章将尝试帮助来自 Git 的新 Perforce 用户了解他们所处的新世界。

在我们潜入之前的一个简短的弯路;如果你更喜欢 Git,你可以很好地将 Git 与 Perforce 一起使用。我们提供了一个名为 Git Fusion 的工具,它可以生成与 Perforce 服务器保持同步的 Git 存储库。Git 和 Perforce 的人可以在相同的代码上和谐相处,而他们的同事选择的版本控制几乎不会影响他们。Git Fusions 13.3 可从Perforce 网站获得。它确实需要由 Perforce 管理员安装,但如果您安装它,您会发现它的存储库切片功能对于 Git 用户来说非常方便。

如果您无法说服您的管理员安装 Git Fusion,Git 本身带有一个称为 Git-P4 的 Perforce 绑定,它允许您使用 Git 在 Perforce 工作区中更改和提交文件。可以在以下位置找到更多信息:https ://git.wiki.kernel.org/index.php/GitP4

还在?好,让我们看看 Perforce。

需要整理的一些术语差异

在我们进入细节之前,我们需要简要介绍一下 Git 和 Perforce 之间的一些术语差异。

首先是结帐。在 Git 中,这是您从给定分支获取代码副本到您的工作区域的方式。在 Perforce 中,我们将其称为来自命令行或 GUI P4V“获取最新版本”的同步。Perforce 使用P4V 或命令行中的p4 edit出一词来表示您计划从版本控制系统更改文件。在本文档的其余部分,我将使用 Perforce 意义上的 checkout。

第二个是 Git commit与 Perforce submit。您将在 Git 中提交的地方将在 Perforce 中提交。由于所有操作都针对共享的 Perforce 版本控制服务进行,因此 Perforce 没有等效的git push. 同样,我们没有pull; 上面的同步命令负责为我们获取文件。Perforce 中没有纯本地提交的概念,除非您选择使用下面简要介绍的 P4Sandbox 工具。

Perforce 中的关键概念

如果我要将 Perforce 简化为两个关键概念,我会专注于仓库和工作空间。Perforce 库是驻留在 Perforce 服务器中的文件存储库。Perforce 服务器可以有任意数量的软件仓库,每个软件仓库可以包含任意数量的文件。您经常会听到 Perforce 用户交替使用 depot 和 server,但它们是不同的。Perforce 站点可以选择拥有多个服务器,但最常见的情况是所有文件都在一个服务器中。

Perforce 工作区或客户端是系统中的一个对象,它将 Perforce 服务器中的一组文件映射到用户文件系统上的某个位置。每个用户在他们使用的每台机器上都有一个工作区,而且用户经常会为同一台机器拥有多个工作区。工作区最重要的部分是工作区映射或视图。

工作区视图指定库中应映射到本地计算机的文件集。这很重要,因为您很可能不想要服务器上所有可用的文件。工作区视图让您只选择您关心的集合。请务必注意,工作区可以映射来自多个 depot 的内容,但只能映射来自一台服务器的内容。

为了在这方面将 Perforce 与 Git 进行比较,您可以使用 Git 挑选您感兴趣的一组 Git 存储库。每个存储库通常都被严格限定为仅包含相关文件。这样做的好处是您无需进行任何配置;你对你关心的事情做了一个 git clone,你就完成了。如果您只使用一两个存储库,这尤其好。使用 Perforce,您需要花一些时间挑选您想要的代码。

许多 Perforce 商店使用可以自动生成工作区视图的流,或者他们使用脚本或模板工作区生成视图。同样,许多人让他们的用户自己生成他们的工作空间。能够在一个工作区中映射多个模块的一个优点是您可以在一次签入中轻松修改多个代码模块;您可以保证任何具有相似客户端视图且同步到您的签到的人都将所有代码处于正确状态。不过,这也可能导致过度依赖的代码;Git 的强制分离可以带来更好的模块化。值得庆幸的是,Perforce 也可以支持严格的模块化。这完全取决于您如何选择使用该工具。

为什么选择工作区?

我认为来自 Git 的人很容易觉得整个工作区概念比它的价值要麻烦得多。与克隆一些 Git 存储库相比,这无疑是正确的。工作空间大放异彩的地方,以及这些年来 Perforce 仍在营业的原因是,工作空间是为开发人员减少数百万个文件项目的绝佳方式,同时仍然可以轻松构建和发布以将所有源代码从一个权威来源。工作区是 Perforce 可以扩展的关键原因之一。

工作区也很不错,因为软件仓库中的文件布局和用户机器上的布局可以根据需要进行更改。许多公司组织他们的仓库以反映他们公司的组织结构,以便人们可以轻松地按业务部门或项目查找内容。然而,他们的构建系统并不关心这种层次结构。工作区允许他们以任何对他们的工具有意义的方式重新映射他们的仓库层次结构。我还看到那些使用极其不灵活的构建系统的公司使用了这种方法,这些系统要求代码处于非常特定的配置中,这让人类完全感到困惑。工作区允许这些公司拥有人类可导航的源层次结构,同时他们的构建工具获得他们需要的结构。

Perforce 中的工作区不仅用于映射用户想要使用的文件集,而且服务器还使用它们来准确跟踪用户已同步的每个文件的修订版本。这允许系统在同步时向用户发送正确的文件集,而无需扫描文件以查看需要更新的文件。对于大量数据,这可能会带来可观的性能提升。这在审计规则非常严格的行业中也很流行;Perforce 管理员可以轻松跟踪和记录哪些开发人员同步了哪些文件。

有关 Perforce 工作区的全部功能的更多信息,请阅读配置 P4

显式结帐与隐式结帐

用户从 Git 迁移到 Perforce 的最大挑战之一是显式结账的概念。如果您习惯于 Git/SVN/CVS 更改文件的工作流程,然后告诉版本控制系统查找您所做的工作,那么这可能是一个极其痛苦的过渡。

好消息是,如果您愿意,您可以在 Perforce 中使用 Git 风格的工作流程。在 Perforce 中,您可以在工作区中设置“allwrite”选项。这将告诉 Perforce 所有文件都应该写入磁盘并设置可写位。然后,您可以更改任何您想要的文件,而无需明确告诉 Perforce。要让 Perforce 协调您所做的更改,您可以运行“p4 status”。它将根据需要打开文件以进行添加、编辑和删除。以这种方式工作时,您将希望使用“p4 update”而不是“p4 sync”从服务器获取新修订;“p4 update”在同步之前检查更改,因此如果您尚未运行“p4 status”,则不会破坏您的本地更改。

为什么要显式结帐?

我经常收到的一个问题是“您为什么要使用显式结帐?” 乍一看,这似乎是一个疯狂的设计决策,但显式结账确实有一些强大的好处。

使用显式签出的一个原因是它消除了扫描文件以查找内容更改的需要。虽然较小的项目计算每个文件的哈希以查找差异相当便宜,但我们的许多用户在工作区中有数百万个文件和/或有大小为 100 兆字节的文件,如果不是更大的话。在这些情况下计算所有哈希非常耗时。显式检出让 Perforce 准确地知道它需要处理哪些文件。这种行为是 Perforce 在游戏、电影和硬件行业等大型文件行业如此受欢迎的原因之一。

另一个好处是显式结账提供了一种异步通信形式,使开发人员可以大致了解他们的同行正在做什么,或者至少知道在哪里工作。它可以让您知道您可能希望避免在某个领域工作以避免不必要的冲突,或者它可以提醒您团队中的新开发人员已经徘徊在他们可能不需要的代码中进行编辑。我个人的经验是,我倾向于在 Git 中工作,或者在我是唯一贡献者或不经常贡献者的项目中使用 Perforce 和 allwrite,并在我与团队紧密合作时明确检查。谢天谢地,选择权在你。

显式签出也很好地与 Perforce 的待定更改列表概念配合使用。待定更改列表是您可以将打开的文件放入其中以组织工作的存储桶。在 Git 中,您可能会使用不同的分支作为存储桶来组织工作。分支很棒,但有时能够在实际提交到服务器之前将您的工作组织成多个命名更改是很好的。借助潜在地将多个分支或多个项目映射到一个工作区的 Perforce 模型,待处理的更改列表可以轻松地组织单独的更改。

如果您使用 IDE 进行开发,例如 Visual Studio 或 Eclipse,我强烈建议为您的 IDE 安装 Perforce 插件。大多数 IDE 插件会在您开始编辑文件时自动签出文件,让您不必自己进行签出。

对 Git 功能的 Perforce 替换

  • git stash==>p4 shelve
  • git local branching ==> Perforce 架子或任务分支
  • git blame==>p4 annotate或来自 GUI 的Perforce Timelapse View

工作中断

有两个选项可以在与 Perforce 版本控制服务(这是我们对 Perforce 服务器的花哨术语)断开连接的情况下工作。

1) 使用 P4Sandbox 进行完整的本地版本控制和本地分支

2) 随意编辑文件并使用“p4 status”告诉 Perforce 你做了什么

使用上述两个选项,您可以选择在工作区中使用“allwrite”设置,这样您就不必解锁文件。在此模式下工作时,您将需要使用“p4 update”命令而不是“p4 sync”来同步新文件。“p4 update”将在同步文件之前检查文件的更改。

Perforce 快速入门

以下所有示例都将通过命令行进行。

1) 配置您与 Perforce 的连接

export P4USER=matt
export P4CLIENT=demo-workspace
export P4PORT=perforce:1666

您可以将这些设置粘贴到您的 shell 配置文件中,用于p4 set将它们保存在 Windows 和 OS X 上,或者使用 Perforce 配置文件。

1) 创建工作区

p4 workspace

# set your root to where your files should live:
Root: /Users/matt/work

# in the resulting editor change your view to map the depot files you care about
//depot/main/... //demo-workspace/main/...
//depot/dev/...  //demo-workspace/dev/...

2)从服务器获取文件

cd /Users/matt/work
p4 sync

3) 签出您要处理的文件并进行修改

p4 edit main/foo; 
echo cake >> main/foo

4)提交给服务器

p4 submit -d "A trivial edit"

5) 运行p4 help simple以查看使用 Perforce 所需的基本命令。

于 2013-06-26T22:04:03.667 回答
24

git 和 p4 之间的最大区别(现有答案都没有解决)是它们使用不同的抽象单元。

  • 在 git 中,抽象是补丁(又名 diff,又名变更集)。git 中的提交本质上是diff在被提交文件的先前状态和当前状态之间运行的输出。
  • 在 perforce 中,抽象是file。p4 中的提交是该时间点提交中文件的全部内容。这被组织成一个更改列表,但修订本身是基于每个文件存储的,并且更改列表只是将文件的不同修订收集在一起。

其他一切都源于这种差异。git中的分支和合并是无痛的,因为从git的抽象角度来看,每个文件都可以通过依次应用一组补丁来完全重构,因此要合并两个分支,只需在源分支上应用所有补丁即可目标分支中不存在以正确顺序到目标分支的目标分支(假设两个分支上没有重叠的补丁)。

Perforce 分支是不同的。perforce 中的分支操作会将文件从一个子文件夹复制到另一个子文件夹,然后在服务器上用元数据标记文件之间的链接。要将文件从一个分支合并到另一个分支(integration在 perforce 术语中),perforce 将查看源分支“头”处文件的完整内容以及目标分支头处文件的完整内容,并且如有必要,使用共同的祖先进行合并。它无法像 git 那样一个一个地应用补丁,这意味着手动合并更频繁地发生(并且往往更痛苦)。

于 2015-02-09T13:06:42.973 回答
20

可能没有很多这样的文档,因为 Perforce 是一个非常传统的版本控制系统(更接近 CVS、Subversion 等),通常被认为比现代分布式版本控制系统更简单。

尝试将命令从一个映射到另一个不是正确的方法。集中式与分布式修订控制系统的概念并不相同。相反,我将描述 Perforce 中的典型工作流程:

  1. p4 edit在您要编辑的每个文件上运行。你需要告诉 Perforce 你正在编辑哪些文件。如果要添加新文件,请使用p4 add. 如果要删除文件,请使用p4 delete.
  2. 进行代码更改。
  3. 运行p4 change以创建变更集。在这里,您可以创建更改的描述,也可以选择从更改集中添加或删除文件。p4 change CHANGE_NUMBER如有必要,您可以稍后运行以编辑描述。
  4. 如果需要,您可以进行额外的代码更改。如果需要添加/编辑/删除其他文件,可以使用p4 {add,edit,delete} -c CHANGE_NUMBER FILE.
  5. 运行p4 sync以从服务器中提取最新更改。
  6. 运行p4 resolve以解决同步中的任何冲突。
  7. 当您准备好提交更改时,运行p4 submit -c CHANGE_NUMBER.

您可以使用p4 revert来恢复对文件的更改。

请注意,只要它们的文件没有重叠,您就可以同时处理多个变更集。(您的 Perforce 客户端中的文件一次只能在一个变更集中打开。)如果您有小的独立更改,这有时会很方便。

如果您发现自己需要编辑已经在另一个变更集中打开的文件,您可以创建一个单独的 Perforce 客户端,也可以通过p4 shelve. (与 不同git stash,搁置不会还原本地树中的文件,因此您必须单独还原它们。)

于 2013-06-25T20:18:00.327 回答