工作空间和工作目录之间的关系是什么

时间:2016-04-04 06:26:34

标签: perforce

我一直在阅读关于Perforce的内容,但没有找到工作区和工作目录之间关系的任何全面解释,例如:文件如何从工作空间出现在工作目录中,如何跟踪它们,工作空间文件和工作目录文件之间可能存在哪些不一致等。

我来自git背景,所以我正在寻找工作区和工作目录交互的描述,类似于git中的索引和工作目录交互。

3 个答案:

答案 0 :(得分:2)

有关综合信息,完整的Perforce文档为available online。但这是术语和概念的基本摘要:

  1. Perforce是一个客户端 - 服务器系统。服务器跟踪文件的更改。开发人员使用其计算机上的这些文件的副本对文件执行修改,将这些修改安排到名为 changelists 的单元中,并在准备好时将提交这些更改列表提供给服务器。
  2. 有关文件的所有信息都存储在服务器上。 客户端工作区是一组关于存储在开发人员工作站上的版本化文件副本的配置数据。对于每个工作空间,服务器会跟踪:哪些文件当前正在同步到该工作空间,正在构建哪些挂起的更改列表,哪个用户正在使用这些文件,工作空间所在的计算机所在的目录等等。 / LI>
  3. 将版本化文件复制到工作区中称为 sync ;提交具有新文件版本的新更改列表称为 submit 。当其他用户提交文件修改时,您的工作区逐渐变得过时;为了使其更新,您可以发出 sync 命令,可能后跟 resolve 命令将新提交的更改合并到您正在编辑的文件中。
  4. 没有git index 构造的精确模拟。修改的文件通过submit命令从其工作站上的开发人员工作空间复制到服务器,然后永久存储在服务器的存档中。 Perforce中的工作流程稍有不同,称为 shelf 。您可以构建包含修改的更改列表,然后使用 shelve 命令将该挂起的更改列表存储在处于搁置状态的服务器上。挂起和搁置的变更列表与git add允许您在提交之前汇总提交的方式有几点相似之处,但也存在许多差异,从Perforce跟踪服务器上的信息开始,而不是在客户端。

答案 1 :(得分:1)

Perfore并不真正具有Git所做的“索​​引/暂存区”的概念。文件仅存在于Perforce服务器(软件仓库)或本地工作目录中。

工作区只是一组配置数据,它告诉Perforce在本地环境中放置哪些文件。

它实际上是一个“绑定”,它指定从库中选择哪些文件以及将它们放在工作目录中的位置。这种灵活性在某些情况下非常有用,但与其他VCS(例如Git / Mercurial / Subversion)相比,它也是一种额外的间接层。

如果查看工作区定义的内容,您将看到指向本地计算机上某个位置的“Root:”部分,以及一个“View:”部分,该部分告诉Perforce您希望同步到该位置的文件

Perforce文档在术语方面有点混乱。在我看过的文档中,“工作空间”指的是您创建的特定工作空间定义(这是Perforce服务器中保存的数据结构)和工作空间绑定的本地工作目录,相当可互换。这是因为工作空间的整个 point 将绑定到特定的本地工作目录。

请在此处查看示例15:Managing files and changelists

p4 sync命令的输出显示 将文件写入C:驱动器。当您“从库中检索文件到您的客户端工作区”时,实际上意味着文件被复制到您的本地工作目录中。

答案 2 :(得分:0)

我们以工作区定义为例。这个解释的关键字段是Client,Root和View,所以为了清楚起见,我只会展示它们:

Client: mysimpleclient

Root:   /Users/johndough/myspecialproject

View:
    //depot/foo/... //mysimpleclient/...

“客户”字段定义工作区的名称。 Root字段定义本地文件系统上工作空间的根。 “视图”字段描述了如何将服务器中的文件映射到工作区文件。 (与Git相比,这增加了一些灵活性,但代价是学习曲线)。我在这里使用了一个非常简单的映射,但这可能要复杂得多。

让我们分解一下View字段。假设服务器有一个文件//depot/foo/bar.txt。

当您同步(获取此文件的最新版本)时,Perforce将使用视图行来确定文件在文件系统上的位置。

以下是我们的观点: // depot / foo / ... // mysimpleclient /...

左侧是depot语法,右侧是工作区语法,它始终以 // workspace_name 开头。 “...”是一个递归的通配符(类似于带有globbing的**)。您可以在心理上用root的值替换工作区名称,以理解​​这一点。

记住我们的根是:/ Users / johndough / myspecialproject

因此,在用该值替换“// mysimpleclient”之后,我们到达: // depot / foo / ... / Users / johndough / myspecialproject /...

让我们使用修改后的视图线来确定bar.txt最终的位置:

// depot / foo / bar.txt /Users/johndough/myspecialproject/bar.txt

这是当你拉下文件时它的工作原理。添加新文件时,将反向读取映射。假设您创建了一个文件/Users/johndough/myspecialproject/fred/file.txt

我们(精神修改)的观点是: // depot / foo / ... / Users / johndough / myspecialproject /...

我们反过来解释这一点。连接新文件与工作空间根的相对路径: / Users / johndough / myspecialproject / fred / file.txt

然后对左侧做同样的事情: //depot/foo/fred/file.txt

完全放弃:

//depot/foo/fred/file.txt /Users/johndough/myspecialproject/fred/file.txt

希望这会有所帮助。工作空间的概念可能是Perforce入门最困难的方面。快乐的编码!