ClearCase嵌套分支的配置规范

3
我们有一个VOB,其中代码开发主要在main分支上进行。在某个时间点上,我们需要开发一些彼此紧密相关的新功能。为此,我们创建了一个新的分支,some_feature_set。多个开发人员在此功能集上工作。每个开发人员都在自己的分支中工作,一旦确定某个子功能完成,就会将其合并回some_feature_set。一旦完全实现了该功能集,计划将其合并到main中。
为了实现这一目标,我们使用以下配置规范:
element * CHECKEDOUT
element * /main/some_feature_set/some_sub_feature/LATEST
element * /main/some_feature_set/LATEST -mkbranch some_sub_feature
element * /main/LATEST -mkbranch some_feature_set

由于 some_sub_feature 的工作计划合并到 some_feature_set 中,我们的想法是在创建任务分支之前就从 some_feature_set 分支中分支出来。

我们的组织使用动态视图(无法更改)。为了保护我们免受其他开发人员对主分支和 some_feature_set 分支所做的更改可能会破坏子功能分支正在进行的工作,我们使用时间戳。因此,配置规范看起来像这样:

element * CHECKEDOUT
element * /main/some_feature_set/some_sub_feature/LATEST
mkbranch some_sub_feature
  element * /main/some_feature_set/LATEST -time <some_time>
  mkbranch some_feature_set
    element * /main/LATEST -time <some_time>
  end mkbranch
end mkbranch

当从main检出文件时,会出现问题。ClearCase会将其分支到some_feature_set,但由于没有规则选择新创建的版本,它将尝试再次分支并发出错误提示分支已存在。我们可以通过向配置规范添加更多规则来解决这个问题:

element * CHECKEDOUT
element * /main/some_feature_set/some_sub_feature/LATEST
mkbranch some_sub_feature
  element * /main/some_feature_set/LATEST -time <some_time>
  element * /main/some_feature_set/0
  mkbranch some_feature_set
    element * /main/LATEST -time <some_time>
    element * /main/0
  end mkbranch
end mkbranch

这样做可以避免在检出文件或向ClearCase添加新文件时出现任何问题。但是,我们会遇到一个问题,即当另一位开发人员想要为仅具有“main”分支的文件执行“some_feature_set”分支的某些工作并检出此文件时,视图选择的版本将发生更改。
例如,假设使用上述配置规范,在我的视图中选择版本“/main/4”以供“some_file”使用。工作继续并行进行,并且由不同的开发人员创建了版本“/main/5”。配置规范中的“time”规则仍将选择版本“/main/4”。在稍后的某个时间点,另一位开发人员必须为“some_feature_set”执行某些工作,并设置具有类似配置规范但具有更新时间戳的自己的视图,以便选择版本“/main/5”的“some_file”。该开发人员必须对“some_file”进行一些更改并对其进行检出。这立即创建版本“/main/some_feature_set/0”和“/main/some_feature_set/some_other_sub_feature/0”。因为“/main/some_feature_set/0”现在存在,所以我的视图选择它。它的内容与之前其他开发人员检出文件时的情况相同,即与“/main/5”而不是“/main/4”。
有什么方法可以防止上述问题发生?
1个回答

1

首先,每个开发者为同一功能开发一个分支不是最佳实践。我长期以来一直反对这种做法(自2009年以来)。

但是如果你必须这样做,并且想要子分支,那么从标签创建它们比依赖时间要更有效。
而且最好不要强制分支路径(这会变得太麻烦,就像你的问题所说明的那样)

我在“ClearCase:加载特定目录的旧版本?”中使用了基于时间的选择规则。
但是你会看到新元素的规则更简单,只出现一次:

element * /main/0 -mkbranch myBranch

你需要为一个元素指定,你希望它直接创建在正确的分支中。
因此,基于分支的选择规则通常使用省略符号...,例如.../myBranch。请参见“ClearCase基本配置规范详细信息”。
总体思路是:只要起始版本是正确的(即具有正确的不可变标签),你就不必关心从哪个分支创建新分支。

@TudorTimi 我同意,但我仍然坚持我的答案。使用...更好。 - VonC
@TudorTimi 出于好奇,为什么你在2017年还在使用ClearCase? - VonC
我从事硬件开发工作,我们的设计流程仍然以基本的ClearCase为中心(没有任何工作流程)。基本上每个人都提交到/main/LATEST,相互之间会互相冲突,并且仅将ClearCase用作备份。 - Tudor Timi
问题不仅仅在于代码库,而是整个设计流程(在软件术语中称为构建设置)。可以将其视为具有N级编译器的情况,每个编译器都会生成下一个编译器链的输入。每个“编译器”的输入也需要手动编辑。已有很多过程确保每个“编译器”生成的内容被下一个编译器使用。这个流程的一部分是数据管理支持。 - Tudor Timi
我可能会就这种事情问更多的问题。谢谢你的回答!能够借鉴更有经验的人的知识真是太好了。 - Tudor Timi
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接