当前位置: 首页 > 工具软件 > Perforce > 使用案例 >

Perforce入门

易波涛
2023-12-01

Perforce工作原理

Perforce应用程序用来在文件信息库与个人用户工作站之间传输文件

Perforce 版本管理服务

Perforce版本管理服务管理公用文件信息库(或称之为depots)。

该服务维护一个数据库以记录变更日志、用户权限以及某个用户在某个时点签出某个文件。

Perforce服务通过本地操作系统来管理数据库和版本化文件,因而不需要专门的文件系统或者卷。

Perforce 应用程序

作用:与版本管理服务进行通讯,管理用户工作站上存储了depot中部分文件的本地拷贝的客户端工作区

Perforce应用程序允许你签入签出文件、 管理冲突、生成开发分支、错误追踪以及变更请求等等,它包括:

  1. P4:所有平台上的Perforce命令行客户端。
  2. P4V:Mac OS X, UNIX, Linux和Windows上的Perforce可视化客户端。
  3. P4Web:Perforce Web客户端, 一个基于浏览器的Perforce界面。
  4. 集成工具或插件:用于与商业IDE和第三方软件的集成。

当你把文件读入工作区时,Perforce应用程序从公用文件信息库请求文件,同时记录你(和其他用户)读取了哪些文件。

Perforce应用程序并不需要保持与版本 管理服务的永久连接。

要使用Perforce,你必须配置你的Perforce应用程序使它连接到Perforce服务,在本地硬盘上指定一个区域作为工作区,选择你工作所需的depot文件的子集

连接到 Perforce 服务

Perforce 应用程序通过 TCP/IP 与服务通讯,也可以选择使用 SSL 来提高安全性。Perforce 应用程序需要知道与之通讯的Perforce信息库的通讯协议、地址和端口

地址和端口被保存在P4PORT环境变量中。根据你所用的应用程序,配置该变量的过程被称为“设置端口”或“连接到服务”。

Perforce应用程序的文档和在线帮助包含了如何设置端口的信息。

把 depot 中的文件映射到工作区

为了控制depot文件在工作区根目录下显示的位置,你必须把公用版本管理服务中的文件和文 件夹映射到本地硬盘的相应区域中。

创建工作区并没有把任何文件从depot传到你的电脑上。工作区及其视图仅仅定义映射以控制 文件传输时depot和工作区的关系。

如果想了解更多关于如何配置映射来定义工作区的话,你可以参照Perforce应用程序的文档和 在线帮助。

其他配置选项

工作区的其他选项使你可以控制Perforce各种操作的默认行为。

如果想了解更多关于这些及其他选项的话,你可以参照专门的Perforce应用程序文档

使用Perforce

从服务器中读取文件

为了将depot文件下载到工作区,你必须从版本管理服务读取。在Perforce上,用depot文件更新工作区通常被称为“同步你的工作区”。

在其他系统上,称之为“更新”、“获取最新版本” 或仅称“获取文件”。

同步到你的工作区

当你同步你的工作区时,你的Perforce应用程序使用工作区视图来把depot文件映射到你的工作区文件上,根据工作区内容比较结果,增删改工作区文件以使你的工作区保持与depot同步。

同步你的工作区时读取每个文件的最新(“head”)版本的拷贝。

在其他版本管理系统上,也被称之为 “tip”版本。

在默认状态下,同步到工作区的文件是只读的,在你签出后才变为可写的。

Perforce应用程序也支持各种选项,使你可以获取文件的较早版本,或在特定时点保存的版本, 或其他用户已加了用户定义标签的版本集。

Perforce 文件指定

Perforce应用程序使用一套规则来定义depot文件与工作区文件的位置关系。

Perforce语法

当你指定Perforce文件时:

  1. 你可以指定到客户端工作区根目录的相对路径(“客户端语法”),
  2. 或指定到depot目录树顶端的相对路径(“depot语法”)
  3. 也可以指定你本地文件系统上的绝对或 相对路径(“本地语法”)。

文件通过客户端语法或depot语法指定时总是以双斜杠(//)开头,后面跟着客户端工作区名或 depot名,以及到客户端工作区根目录或depot目录树顶端的相对路径的文件路径名全称。

不管本地 操作系统用的是什么分隔符,客户端语法以及depot语法上的路径成分都是以单斜杠(/)分隔。

语法例子
Depot语法//depot/main/src/file.c
客户端语法//myworkspace/module/file.c
本地语法C:\Projects\working\module\file.c

当把depot文件映射到本地硬盘时,工作区名是工作区根目录的别名。

例如,当工作区名为myworkspace,工作区根目录为C:\Projects\working时,通过View //depot/main/src/... //myworkspace/module/...把depot文件 //depot/main/src/file.c 映射到工作区 C:\Projects\working\module\file.c 上。

View 表示的是Stream 视图,详情可在本文 ‘使用Steam’ 章节查阅

在视图中使用通配符

你可以在配置Perforce工作区视图时使用这些通配符。

通配符意义意义
*匹配所有字符但不包括目录内的斜杠。/src/*.c 匹配 /src/file.c 和/src/file2.c,
匹配当前工作目录下的 所有文件和子文件夹。/src/… 匹配 /src下的所有文件和子文件夹
%%1- %%9位置指定符,用来替换视图中的部分文件名。映射 /%%1/%%2/… 到 /%%2/%%1/…将把/web/images/file.gif 映射到 /images/web/file.gif

这些通配符也用在命令行客户端上的文件指定。

如果想了解更多关于Perforce语法及通配符的 话,你可以参照《Perforce命令参考》。

指定文件的特定版本

Perforce用#字符来表示文件版本。

  1. Perforce中的文件版本按顺序递增,#1表示第一个版本, 依此类推。
  2. 文件的最近的版本是服务器上该文件的最高版本,被称为head版本。
  3. 你最后同步到工 作区的版本被称为have版本。
  4. 文件的零版本被称为空版本,不含数据。

标识符file.c#3/4表示你当前已经把file.c的#3版本同步到了工作区,file.c的最近版本是#4。

语法指定备注
file.c#3file.c的第三个版本“同步到file.c的第三个版本”
file.c#headDepot中file.c的最近版本从depot获取文件的最新版本,把工作区同步成head版本。
file.c#have最后同步到工作区的file.c的 版本,这是have版本。当你废弃一个文件的变更时,Perforce应用程序把 你工作区中的文件恢复到have版本。
file.c#none file.c#0文件file.c的不存在的或空的版本。当你用Perforce应用程序从工作区删除文件时,你实际上在工作区中把该文件的版本同步到空版本。

Perforce 语法以及状态栏

head, have和null版本 (#head, #have和#none)的语法被用在命令行客户端以及图形应用程序的状态窗口中。

详细请参照《P4用户指南》。

支持哪些文件类型?

Perforce文件类型包含6种基本文件类型。

  • 文本文件
  • 二进制文件
  • Macintosh上的本地apple文件
  • Mac资源派生
  • 符号链接(symlinks)
  • unicode (以及utf16)文件

在默认情况下,当某人把文件追加到depot中时,Perforce试图自动判别文件的类型。

你通过把文件打开编辑为新的文件类型从而可以改变文件的类型。

6种基本文件类型可以附加修饰符(如+w, +x, +k及其它)用来控制诸如锁定行为、工作区内的文件权限或者版本在服务中如何存储。

《Perforce命令参考》中包含了文件类型以及可用修饰符的完整列表。

文件操作

Changelist是Perforce中的基本工作单位。

所有版本管理系统共通的文件编辑基本操作(如编辑文件、添加文件、删除文件、恢复变更以及签入文件)都在Changelist中执行。

利用 changelist

在你对工作区中的文件进行操作之前,你必须先在changelist中打开该文件。Changelist包含了一系列文件、它们的版本号、你对这些文件的变更以及描述你所进行工作的注释。

Changelists有两个用途:

  • 通过汇总相关联的文件变更从而把工作组织成逻辑单元。
  • 通过把相关联的文件变更一并签入来保证工作的完整性。

如果你在修改某个软件时需要修改三个文件,那你就在一个changelist中打开这三个文件。

Perforce changelist是不可分割的事务。如果一个changelist涉及三个文件,要么这三个文 件的变更都被提交到depot,要么都没有被提交。

在changelist提交期间Perforce客户端与服务器端的连接被中断时,整个提交失败。

Changelist 编号是如何工作的

未提交到depot中去的changelist是作业中的changelist

已提交到depot中的包含变更的changelist是已提交changelist

每个changelist都有一个changelist编号(由Perforce生成)和changelist注释(由执行该变更的用户提供)。

当你在Perforce中打开一个文件时,该文件在默认的changelist中被打开。

当你把文件签入 depot时默认changelist被赋予一个changelist编号。

编辑文件

为了编辑文件,你把该文件签出到一个changelist。

Perforce应用程序使客户端工作区的该文件拷贝变为可写,并通知公用服务你已经把该文件打开为编辑。

添加新文件

为了添加文件,你在工作区创建文件并在一个changelist中把它标记为追加目的

Perforce 应用程序决定文件类型(你可以重设该文件类型),并通知公用服务你准备添加文件。

删除文件

为了删除文件,你在一个changelist中把它标记为删除目的。文件立即被从工作区中删除。

Perforce应用程序通知版本管理服务你准备删除文件,但直到你提交了该changelist之后,该文件才在depot中被标记为已删除。

被删除的文件实际上并没有从depot中移除。你可以通过同步之前的版本到工作区来恢复已删除文件。

废弃不需要的变更

你可以通过恢复文件来废弃你对文件所做的任何变更。

恢复文件把该文件从changelist中删除并把你工作区中的文件拷贝恢复到你最后同步到工作区的版本。

如果你恢复一个打开为编辑标记为删除的文件,你最后同步的文件版本将被恢复到工作区。

如果你恢复一个标记为添加的文件,该文件从changelist中删除,但文件的本地拷贝将保留在工作区中。

签入文件

你可以通过提交该 changelist把你的工作签入到depot中。不存在部分提交的changelist。

解决冲突

如果你的变更与别的用户较早提交的变更产生冲突,Perforce将要求你解决冲突后重新提交该changelist。

冲突解决的过程允许你选择需要做的事情:

  • 是用你的文件覆盖别的用户的文件?
  • 或是抛弃你的文件转而选择别的用户的变更?
  • 还是把这两个冲突的文件合二为一?

根据你的请求,Perforce将对这两个冲突的文本文件以及产生这两个冲突文件的文件进行三路合并。

并行工作

三路合并过程有助于解决文本文件的变更冲突,但对图像或编译代码之类的二进制文件不一定有效。

如果你所处理文件的合并无效,你可以锁定这些文件以免别的用户的修改影响你的工作。

Perforce支持两种类型的文件锁定:

  • 你可以用文件锁定来防止文件被签入
    • 为防止别的用户对你正在处理的文件签入变更,锁定该文件
    • 别的用户仍可以签出该文件, 但必须等到你提交完变更后他们才能提交影响被锁定文件的changelist。
  • 也可以以独占方式打开来防止文件被签出
    • 为防止同一文件同时被多个用户签出,使用以独占方式打开文件类型修饰符+l(File(type+l) )。
    • 具有+l文件 类型修饰符的文件每次只能被一个用户打开。
    • Perforce管理员可以用一个名叫typemap的特殊的表来自动指定某些文件类型为以独占方式打开。

如果想了解更多关于文件锁定、以独占方式打开文件类型修饰符以及typemap表单的话,你可 以参照《Perforce命令参考》以及《系统管理员手册》。

比较文件

p4 diff和p4 diffs命令产生与UNIX和Linux系统中的标准diff命令类似的输出。

其它的Perforce 客户端程序(包括P4V)含有P4Merge,能提供文件差分的图形化视图。

审查单个文件的变更历史

文件的历史用一系列文件版本表示,每个文件一个版本。

每个文件版本与一个changelist关联。 你可以通过工作区中的版本来比较文件,也可以通过任何存储在depot中的版本来比较

审查文件组的变更历史

文件夹的历史用一系列changelist表示。文件夹没有单个的版本号。

相反的,每个包含至少一个文件的changelist都被看做文件夹历史的一部分。

Perforce 语法以及状态栏

Perforce拥有语法格式,用来指定某个文件通过提交带编号的changelist而在depot中存在,或是被打上某个易记的标签,或是某个日期和时间点的。

这些语法格式(@changelist, @labelname, 或 @date, 或 #start,end)通常只用在命令行客户端上,但它们也出现在其他Perforce应用程序的状态窗口中。

详情请参照《P4用户指南》。

codeline管理

codeline是一起演变的关联文件集。

为了把相关文件按某个目的归类,比如作为新产品或发布 版本,你可以创建分支。

为了在分支间复制变更,你可以反映changelist。

为了产生某个特定状态的文件的快照,你可以创建标签,或通过指定日期或changelist编号来指定文件集合。

分支基础知识

分支是管理两个或更多相关文件集合的变更的方法。

Perforce Inter-File Branching机制使你在把任何文件集拷贝到depot新位置时,一个文件集的变更可以被复制或反映到另一个文件集。

新的文件集(或codeline)与原有的文件单独开发,但通过反映的办法,一个codeline中的变更可以复制到另一个codeline。

创建 codeline

为了创建codeline或开发分支,决定哪些文件属于该分支(源文件)并把那些文件反映到新的 codeline以创建目标文件。Perforce服务器在changelist中“以分支/同步为目的打开目标文件”。

反映还能让Perforce执行文件的“偷懒拷贝”。当你分支文件时,版本管理服务实际上并没有保留文件的两个拷贝——它保留源文件以及记录源文件和目标文件关系的指针。

偷懒拷贝使分支成为低负荷操作,版本管理服务不需要记录文件的两个拷贝。

在 codeline 之间复制变更

你可以用类似于创建codelines的方法通过反映在相关codelines之间复制变更。

为了把发布分支上所做的工作复制到主线上,你可以通过解决发布分支和主线上所做变更引起 的所有冲突,把//depot/rel1.0上的源文件反映到//depot/main中。

解决 codeline 之间的差别

工作区中的目标文件的版本被称为“yours”,depot中的源文件的版本被称为“theirs”。当 这些文件的变更没有冲突时,变更能自动被合并。当发生冲突时,你必须选择接受哪个变更:

  • 自动:在很多场合,选择接受“yours”变更(即工作区中的目标文件的版本)或是 “theirs” 变更(即depot中的源文件的版本)。
  • 接受合并结果:有时,“theirs”中的文件发生变更而不与“yours”产生冲突。在这种情 况下,Perforce把该两个文件合并并让你接受合并结果。这样的解决方案被称为安全的自动解决冲突(包含合并)。
  • 手动合并:有可能“theirs”和“yours”中的相同的行发生变更,这些行为将发生冲突。你要么在提交之前手工编辑该合并文件,要么接受包含冲突标记的合并文件并在随后的changelist 中解决该冲突。

复制复杂分支结构

Perforce提供两种分支机制:利用文件式样反映利用分支映射反映

  • 对于简单的分支结构,你可以手动指定源文件和目标文件的路径,并利用文件式样把源文件反映到目标分支上。
    • 每次利用文件式样进行分支,你都必须手动指定源和目标codeline。
  • 对于较复杂的分支结构,你可以设置分支映射,使你能可靠地复制最复杂的分支结构
    • 分支映射保存一套映射规则(分支视图)用来控制源分支中的文件如何反映到目标分支。
    • 在你设置了分支映射之后,你就能利用分支映射来执行视图中所指定的所有反映。

记录 codeline 之间的变更历史

P4V的版本图功能是使分支间的文件历史可视化的方便途径。

使用 Streams

Perforce streams是组成项目、codeline以及组件和文件的结构化容器。Perforce命令行客户端以及P4V之类的应用程序为streams提供了广泛的支持。

如果想了解使 用streams工作的详细信息的话,你可以参照《Perforce命令参考》、p4 command line help 和 P4V online help。

使用Streams有如下好处:

  • 保证对分支的层次化访问。
  • 提供一个富有创意的最佳实践分支策略。
  • 为Perforce服务提供分支层次的metadata。
  • 提供构造代码(稳定性和层次)的标准方法。
  • 自动生成客户端工作区视图和分支视图。
  • 提供stream结构和状态的引人注目的可视化。
  • 使你能组织和观察代码(主体)。
  • 提供规则使开发更容易。

Perforce streams为以下四个问题提供解决方案,从而改进了Perforce的默认分支模型:

  • 你无法命名分支:分支是路径的集合。你可以命名分支式样,但分支式样缺少起源和稳定性。创建分支视图难,定义streams容易。
  • 没有外部工具,你就无法定义好的分支结构:Perforce允许你做任何你想做的事。小型安装能免除许多细节,但企业级用户需要符合他们商业和技术流程的准则和最佳实践。Streams 确保了层次型分支,使分支之间的非正常关系最小化。
  • 复制变更的效率低下:利用定义明确的streams,用户可以只复制分支将发生变化的文件并能保证生成有意义的反映历史。
  • 变更复制不正确:默认情况下,你可以无限制地反映文件。Streams保证变更沿着层次流动以及合并和冲突解决正确。

Streams并不保证效率和确定性,但一个好的层次结构控制了哪些需要分支并保证变更传递的 正确性。

想利用streams工作,你要执行下列步骤:

  1. 创建一个stream depot
  2. 创建并填充一个mainline stream
  3. 分支开发stream和发布stream
  4. 合并以及拷贝变更

你(主要)利用下列命令来管理streams:

  • p4 stream:创建、编辑或删除一个stream规范。
  • p4 streams:显示一个流列表。
  • p4 merge:合并一组文件到另一组文件。
  • p4 copy:将文件从仓库的一个位置复制到另一个位置。
  • p4 resolve:解决文件修订之间的冲突。
  • p4 cstat:转储当前客户端工作区的更改/同步状态。
  • p4 istat:检查stream所需的集成。

其他接收stream参数的命令如下:

  • p4 branch:创建或编辑分支映射及其视图。
  • p4 client:创建或编辑客户机工作区规范及其视图。别名:p4 workspace
  • p4 clients:列出系统当前已知的所有客户端工作区。
  • p4 diff2:比较两个存储文件修订。
  • p4 dirs:列出指定仓库目录的直接子目录。
  • p4 integrate:打开文件以进行分支或合并。
  • p4 interchanges:报告更改尚未整合(integrate)。

如果想了解命令语法和标示的详细信息的话,你可以参照《Perforce命令参考》或使用p4 help commandname命令。

你可以用p4 help streamintro命令来了解大概。

或者访问这里here

设置结构

首先创建一个stream depot。

Stream depots除了以下几点外与本地depots相同:

  • 流程受stream式样控制。
  • Streams只接收从与stream关联的工作区的提交。
  • 可以同步和编辑导入文件,但不能提交。你可以整合stream和本地depot的文件。

接着,创建分支层次中的每个stream,定义stream式样,指定stream名、stream双亲和stream 类型。

默认情况下,stream从其双亲继承文件结构和内容。

为了满足进一步的要求,你可以通过定义路径映射来指定映射,该映射重定义stream包含的文件路径。

Stream 的类型

Stream类型标志着相对固定。目前支持下列的stream类型:

  • mainline: 不含双亲的stream。
    • 期待从较稳定的streams向下合并。
    • 期待从较不稳定的streams 向上拷贝。
    • stream系统的稳定主干。
  • release: 含双亲稳定的stream。
    • 期待从较稳定的子streams向下合并。
    • 不期望从双亲stream 向上拷贝。
    • 有利于持续的稳定、缺陷修改和发布维护。
  • development: 含双亲不稳定的stream。
    • 期待从双亲streams向下合并。
    • 期待从较不稳定的子 streams向上拷贝。
    • 不期望有更稳定的子streams。
    • 有助于长期项目,主要是新功能。
  • task: 像开发stream一样工作。
    • 用于轻型的短期分支。是一种不常见的分支。
    • 在使用时,只有与task stream关联的工作区能看见stream中的所有文件。
    • 其他工作区只能看到你在task stream 中变更了的并拷贝到双亲的文件版本。
  • virtual: 对双亲stream视图的筛选有用。

Stream 视图

为配置stream所含文件,你需要定义stream视图。视图由一系列路径组成,你对这些路径赋予控制它们特性的下列类型:

  • share: (默认) 共享路径中的文件是可同步、可提交且可反映的。
    • 共享路径用于变更可以在 streams间流动的文件。
  • isolate: 文件可编辑但变更无法反映到别的streams。
    • 孤立路径用于保存每日构建和其他产 生的文件。
  • import: 文件可以从指定位置读取,但无法编辑或反映。
    • 导入路径用于在stream中必须存在 但并不工作的第三方组件。
    • 导入路径从双亲stream继承视图,除非它的depot位置被显式定义。
  • exclude: 防止双亲stream中的文件成为子stream的一部分。
    • excluded路径中的文件是不可同步、不可提交且不可反映的。

填充 streams

在定义了mainline stream后,你通过追加文件或反映文件,把它们拷贝到较不稳定的子 streams或合并到较稳定的双亲从而复制该stream。

复制变更

一般的,你先定义并复制mainline,然后在mainline下方创建开发streams。

你通过从mainline 合并来保持开发streams为最新。

当开发工作稳定时,你把它拷贝到主线。

当需要准备发表版本时, 你可以创建发布stream并在其中使发表版本稳定,然后作为发布stream的子stream创建开发stream 并在其中修改缺陷。

学习更多分支知识

虽然Perforce的分支机制相对简单,但分支的理论可以相对复杂。

什么时候创建分支?代码变更在什么时点从一个codeline复制到另一个codeline?谁负责执行合并?

这些问题对任何版本管理系统而言都是共通的,但答案需要不断地学习才能理解。

后继工作

任务并缺陷追踪

Perforce包含一个叫做jobs的基本缺陷跟踪系统。

Perforce job主要负责任务描述,诸如缺陷 修改或变更请求之类。

Perforce的任务跟踪机制允许你把一个或多个任务链接到changelist上以实 现任务所指定的工作。

关联job和changelist有助于团队了解任务是否已完成,何时完成的,谁负责该任务,哪些文件版本跟该任务有关。

当changelist被提交时,与changelist关联的job被标记为closed。

可以定制job系统所追踪的信息内容和类型;Perforce管理员可以添加、修改或删除Perforce 作业所用的字段。

详情请参照《系统管理员指南》。

也可以把Perforce与第三方缺陷跟踪和工作流系统整合

P4DTG(Perforce缺陷跟踪平台) 是包含图形化配置编辑器和复制引擎的综合平台。详情请参照这里

给文件加标签

Perforce标签是加上标签的文件版本的集合,它允许你在工作区内复制特定的文件组。

详情请参照《P4 用户指南》。

编辑器和合并工具

Perforce应用程序带有选项,允许你指定所喜欢的文本编辑器或合并工具。

详情请参照《Perforce应用程序》的文档。

保护和权限

Perforce提供权限表,以防未经许可的或无意的访问。

权限表决定哪些Perforce命令可以执行, 在哪些文件上由谁在哪个工作站执行。

Perforce管理员可以在Perforce命令行客户端上利用p4 protect命令,或者用Perforce管理工具P4Admin来设置权限。

详情请参照《系统管理员指南》。

用户和许可证

该共享版本管理服务根据它所支持的用户数而获得许可。

该许可证信息保存在服务器根目录中的叫做license的文件中。license文件是由Perforce软件提供的普通文本文件。

如果没有license文件,Perforce版本管理服务限制为20个用户/20个客户端工作区(文件数无限制),或用户数和工作区数量无限制(但文件数限制在1000个以内)。

详情请参照《系统管理员指南》或联系技术支持。

从哪里可以更多了解 Perforce

为了从所有Perforce应用程序中获得在线帮助:

  • 在Perforce应用程序的图形界面中利用帮助菜单。
  • 在命令行客户端的命令行上输入p4 help

可以从这里获得Perforce文档

Perforce论坛是用户提问并接收其他用户信息的场所:

 类似资料: