免责声明:我最了解的源代码控制系统是 SVN。因此,我对 repo、checkout 等术语的使用影响了我的使用。此外,我每天都使用 Accurev,但我往往不会冒险远离我认为我已经牢牢掌握的核心概念。
一句话(带星号): Accurev 是一个按时间排序的存储库,它保留为每个流/工作区更改的文件的修订历史记录,并允许您开发不同版本的代码(在流中),同时每个流透明地更新来自其父和子*流的核心代码。
(*)仅当子流将更改提升到父流时,子流才会更新流。
Accurev 的主要好处是能够轻松维护不同版本的代码。如果您想掌握它,我不会寻找用您熟悉的语言重新定义的快速抽象或术语。我会寻找示例并在出现术语时对其进行温和的解释。不幸的是,我只知道我需要知道的,但我会试一试......
(我稍后会进入工作区。此时不要担心它们。)
当您创建一个以另一个为父的流时,就像您创建了一个 SVN 分支来创建子流一样,但是(奇妙的)区别在于,每次更新父流或子流(或当存在冲突并且您需要手动解决冲突时,您会收到警报)。
假设您从一个流 CompanyStream 开始。您的代码库由该流管理,并且它具有您对文件所做的更改的历史记录。然后,您决定在其下方创建两个子流,ChildStream1、ChildStream2。对 CompanyStream 中的文件所做的任何更改都将渗透到两个子流,因此它们始终具有从 CompanyStream 继承的最新代码。(修订更改的继承是 Accurev 中的一个主要概念。)同时,您正在对 ChildStream1 中的一个供应商进行特定的开发,并在 ChildStream2 中进行特定于另一个供应商的更改。您可以有选择地决定将 ChildStream1 和 2 中的哪些代码提升到 CompanyStream,但在 CompanyStream 中所做的任何更改都应该是您希望出现在两个子流中的内容。
流可视化如下所示:
CompanyStream --
|-- ChildStream1
|-- ChildStream2
Accurev Overlap = 自您更新流后,父流中的文件已被修改。将父流可视化为在您上方(这就是它将在客户端中显示的方式),并且该流已水平推进,因此它与您所在的时间点重叠。
SVN 到 Accurev 概念的快速映射:
SVN Checkin - 促进
SVN Checkout - 锚(锚定某物使其成为 WIP - 正在进行中)
SVN 更新 - 更新
Accurev 工作区
我还没有提到工作区。工作区代表硬盘驱动器上的代码。工作区类似于流,因为它可以有历史记录,并且可以跟踪您所做的更改。(这就是 Keep 所做的——它将您在 Keep 操作期间指定的文件的快照存储在工作区的历史记录中。您可以随时恢复到这些文件快照。因此,工作区也可以被视为您的拥有自己的私人流,这是对其中代码所做的更改的记录。)
流是代表修订更改的抽象概念,以及所发生事件的历史。流和工作区从其父流继承代码。但是,与流不同,工作空间不能有子流或子工作空间。工作空间就像树上的叶子;溪流就像树枝。
- 当我“保留”一些文件然后“提升”它们时会发生什么?
您提升到流。你保持到一个工作区。所有可以看到信息流的人都可以看到升级的更改。保留的更改仅对您(工作区的所有者)可见。
保留的文件将在您的工作区中有快照(以防您想恢复它们)。提升的文件将在您提升它们的流中具有快照(可以这么说)。最大的区别在于,提升的更改将渗透到继承该流的任何流或工作区。
然后它们只会在您的工作区中。另外,我相信当您进行促销时,Accurev 会首先保留(因此您在工作区和要促销的流中都有文件更改的记录)。
- 为什么在发生非冲突(又名重叠)更新时,历史有时会被错误归因?这尤其让人想起 Subversion 的故障模式,根据我听到的基本解释,我认为 Accurev 不应该存在这种模式。
能给我举个例子吗?我对 Accurev 的文件版本控制的把握有点模糊。我相信版本属性将由提升最近更改(而不是保留)的工作区或流分配。有可能存在一些流继承关系,导致文件具有看起来不正确的属性,直到您对其进行跟踪。
- 为什么差异几乎从不包含我期望的内容?我相信发生的事情是,与基础的差异向我展示了与当前(移动)父流的差异,但我真正想要的只是看到自上次更新以来我所做的更改。
然后对“Backed”进行比较,而不是对 Basis。
对我有用的简单配置是:我总是从一些公共开发流中创建自己的个人私有流。然后,当我做出想要签入(或能够恢复)的更改时,我会提升到我自己的流。我一直在我的工作区工作,如果我想将我的工作区与我以前做过的事情或我上面发生的事情(其他人所做的更改)进行比较,我会对 Backed 进行比较。
对不起,这么久。希望它有帮助...