Perforce:通过分支如何存储文件?

Perforce:通过分支如何存储文件?,perforce,Perforce,关于分支和复制资源的一个非常基本的问题,由于我们主要分支的规模,我已经进行过类似的讨论,但是抛开它,了解它是如何工作的是很好的 考虑分支几十Gb的问题。 当您创建这大量信息的分支时会发生什么 我正在阅读官方文件,但仍然对服务器上每个分支的文件存储方式感到困惑 假设主分支中存在一个文件a.txt。 当创建分支Xbranch并考虑到A.txt不会有更改时,Performce服务器会复制A.txt吗?一个保留主要更改,另一个用于Xbranch 对于海量数据,这将成为一个问题,因为这将意味着重复几十Gb

关于分支和复制资源的一个非常基本的问题,由于我们主要分支的规模,我已经进行过类似的讨论,但是抛开它,了解它是如何工作的是很好的

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

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

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


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

一般来说,分支文件不会创建文件内容的副本;相反,Perforce服务器只写入一条描述新版本的附加数据库记录,但共享文件内容的单个副本

Perforce将其称为惰性副本;您可以在此处了解更多有关它们的信息:


一个例外是,如果使用+S filetype修饰符,在本例中,每个分支都有自己的内容副本,因此可以在每个分支上单独正确执行+S语义。

一般来说,对文件进行分支不会创建文件内容的副本;相反,Perforce服务器只写入一条描述新版本的附加数据库记录,但共享文件内容的单个副本

Perforce将其称为惰性副本;您可以在此处了解更多有关它们的信息:


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

除了Bryan Pendleton的答案和其中的问题外,还有一些注释

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

您还需要知道您正在使用的服务器版本,因为随着时间的推移,该行为已得到增强。检查p4帮助删除的输出:

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

其他几点:

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

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

您还需要知道您正在使用的服务器版本,因为随着时间的推移,该行为已得到增强。检查p4帮助删除的输出:

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

其他几点:

p4 integrate to create分支的默认标志将文件复制到客户端工作区,然后使用submit将文件复制回服务器。这需要时间,具体取决于文件的数量和大小。长期以来,使用-v virtual标志就可以避免这种情况,该标志只在服务器上创建适当的行,并避免更新客户机工作区—通常速度非常快。可能的轻微缺点是,您必须在以后同步这些文件才能处理它们。 Perforce的较新版本有p4 populate命令,该命令与integrate-v命令相同,但实际上也不需要将目标文件映射到当前的客户端工作区中-这避免了许多初学者一直难以克服的可怕的客户端视图中无目标文件错误![在P4V中,这是右键单击菜单上的分支文件…命令,而不是合并/集成…] Streams在许多方面使分支变得更加灵活和容易——值得一读和玩味的是,唯一一个潜在的美中不足之处是扁平的2级命名层次结构,以及将具有现有关系的现有分支迁移到Streams中的潜在挑战 任务流非常漂亮,可以在服务器上节省大量空间 “删除”有一个有趣的标志-在一些版本中为b,这就像能够快速轻松地删除未更改的分支文件一样-就像追溯创建任务流一样。在具有大量分支的大型安装中,可以潜在地保存数百万个数据库行
非常感谢。因此,基本上没有+S,我不需要担心硬盘空间,perforce实际上是使用这些参考优化空间。。。好的,很好。但是如果你有一个从Xbranch创建的Ybranch,然后我决定删除Xbranch,会发生什么呢?我知道这是可能的,但是对文件的引用实际上会被对Ybranch的真实文件所取代吗?而且,创建这么多Gb的分支应该非常快,对吗?我们正在远程管理我们的仓库,因此唯一的问题是即使使用代理服务器也要下载到工作区,这取决于我们的连接速度。如果您计划创建只在短时间内存在的分支,您应该研究最新Performce server的新任务流功能。不再需要擦掉树枝;您只需删除任务流,数据库记录就会被清理。而且,您是正确的:创建分支会很快,但将分支同步到您的计算机仍需要下载文件。如果使用Perforce streams功能,您可以在相关分支之间快速切换,而无需重新同步所有文件。顺便说一句,我建议您仅使用“删除”来更正严重错误,例如意外检入机密文件。你不应该经常使用它。我们已经进行了14年的性能回购,并使用了大约一次擦除。我是Performce咨询公司的合作伙伴。谢谢!因此,基本上没有+S,我不需要担心硬盘空间,perforce实际上是使用这些参考优化空间。。。好的,很好。但是如果你有一个从Xbranch创建的Ybranch,然后我决定删除Xbranch,会发生什么呢?我知道这是可能的,但是对文件的引用实际上会被对Ybranch的真实文件所取代吗?而且,创建这么多Gb的分支应该非常快,对吗?我们正在远程管理我们的仓库,因此唯一的问题是即使使用代理服务器也要下载到工作区,这取决于我们的连接速度。如果您计划创建只在短时间内存在的分支,您应该研究最新Performce server的新任务流功能。不再需要擦掉树枝;您只需删除任务流,数据库记录就会被清理。而且,您是正确的:创建分支会很快,但将分支同步到您的计算机仍需要下载文件。如果使用Perforce streams功能,您可以在相关分支之间快速切换,而无需重新同步所有文件。顺便说一句,我建议您仅使用“删除”来更正严重错误,例如意外检入机密文件。你不应该经常使用它。我们已经进行了14年的性能回购,并使用了大约一次擦除。我是Performce咨询公司的合伙人。