1

关于分支和复制资源的一个非常基本的问题,由于我们的主分支的大小,我已经进行过这样的讨论,但是抛开它知道它是如何工作的很好。

考虑分支几十个 Gb 的问题。当您创建大量信息的分支时会发生什么?

我正在阅读官方文档herehere,但我仍然对如何为服务器上的每个分支存储文件感到困惑。

假设主分支中存在文件 A.txt。在创建分支 (Xbranch) 并考虑 A.txt 不会有更改时,perforce 服务器是否会复制 A.txt(一个保留主要更改,另一个用于 Xbranch)?

对于海量数据,这成为问题,因为这意味着复制数十个 Gb。那么这到底是如何工作的呢?

4

2 回答 2

4

除了 Bryan Pendleton 的回答(以及其中的问题)之外的一些注释

要真正检查您对正在发生的事情的理解,最好尝试使用包含少量文件的测试存储库并在每个主要操作后创建检查点,然后比较检查点以查看实际写入的数据库行(以及就像查看服务器维护的存档文件一样)。这非常快速且易于设置。您会注意到每个分支文件都会在 db.integed、db.rev、db.revcx 和 db.revhx 中生成记录——更不用说 db.have 中的任何记录了。

您还需要知道您正在使用哪个服务器版本,因为该行为已随着时间的推移而得到增强。检查“p4 help obliterate”的输出:

Obliterate 知道“p4 集成”创建分支时生成的惰性副本,并且不会删除仍在使用的副本。因此,删除文件并不能保证存档中的相应文件将被删除。

其他几点:

  • 用于创建分支的“p4 集成”的默认标志将文件复制到客户端工作区,然后通过提交将它们复制回服务器。这需要时间,具体取决于文件的数量和大小。长期以来,使用 -v (虚拟)标志可以避免这种情况,它只是在服务器上创建适当的行并避免更新客户端工作区 - 通常速度要快得多。可能的轻微缺点是您必须在之后同步文件才能处理它们。
  • 较新版本的 Perforce 具有“p4 populate”命令,其作用与“integrate -v”相同,但实际上并不需要将目标文件映射到当前客户端工作区——这避免了可怕的“无目标文件” )在客户端视图中”许多初学者都在努力解决的错误![在 P4V 中,这是右键菜单上的“分支文件...”命令,而不是“合并/集成...”]
  • Streams 在许多方面使分支变得更加流畅和容易 - 非常值得阅读和使用(美中不足的唯一潜在问题是扁平的 2 级命名层次结构,以及将具有现有关系的现有分支迁移到流中的潜在挑战)
  • 任务流非常漂亮,节省了服务器上的大量空间
  • Obliterate 有一个有趣的标志 -b 用于一些版本,这就像能够快速轻松地删除未更改的分支文件 - 就像重新创建任务流一样。可以在具有大量分支的大型安装中保存数百万个数据库行
于 2013-10-08T11:37:30.383 回答
3

通常,分支文件不会创建文件内容的副本。相反,Perforce 服务器只是写入一个描述新修订的附加数据库记录,但共享文件内容的单个副本。

Perforce 将这些称为“惰性副本”;您可以在此处了解有关它们的更多信息:http: //answers.perforce.com/articles/KB_Article/How-to-Identify-a-Lazy-Copy-of-a-File

一个例外是如果您使用“+S”文件类型修饰符,因为在这种情况下,每个分支都将拥有自己的内容副本,因此 +S 语义可以在每个分支上独立地正确执行。

于 2013-05-29T20:53:51.907 回答