小编典典

为 Git 用户执行强制?

all

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

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

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


阅读 46

收藏
2022-08-21

共1个答案

小编典典

在过去的几周里,我一直在做这件事。它仍在发展,但它可能会有所帮助。请注意,我是 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 所需的基本命令。

2022-08-21