我們有一個VOB,代碼開發主要在main
分支中完成。在某個時間點,是時候研究一些彼此密切相關的新功能。爲此,我們創建了一個新分支,some_feature_set
。多位開發人員使用此功能集。每個開發人員都在自己的分支中工作,一旦某個子功能被視爲已完成,它將合併回some_feature_set
。一旦功能集完全實施,該計劃將合併到main
。嵌套分支的ClearCase配置規範
爲了實現這一目標,我們使用配置規格像這樣的:
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
創建任務分支之前已經轉移。
我們的組織使用動態視圖(我們不能改變它)。爲了保護自己免受其他開發人員對可能破壞子功能分支中正在進行的工作的main
和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的時候,我們沒有得到任何的問題。然而,我們得到的問題是,當另一個開發人員想爲some_feature_set
分支做一些只有main
分支的文件並且檢查該文件時,視圖選擇的版本將會改變。
比方說,在上面列出的配置規範中,版本/main/4
在我看來被選爲some_file
。工作並行繼續,版本/main/5
由不同的開發人員創建。配置規範中的time
規則仍將選擇版本/main/4
。在稍後的某個時間點,另一位開發人員必須爲some_feature_set
做一些工作,並使用類似的配置規範建立自己的視圖,但使用更新的時間戳,以便some_file
獲得版本/main/5
。該開發人員必須對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
,與其他開發者檢出文件之前的情況相同。
有什麼辦法可以防止上述問題的發生?
我的措辭可能是錯誤的。我說'some_feature'的地方是指一些大家族的子特徵,我說'some_task'我的意思是其中的'子特徵'。我明白工作流程應該是面向工作的,而不是面向開發人員的。我會更新我的問題。 –
@TudorTimi我同意,但我的答案仍然存在。使用...更好。 – VonC
關於時間戳與標籤的關係,我們沒有任何標籤,因爲我們沒有定義任何中間里程碑。目前我們只有時間戳。談論除了釋放以外的目的的標籤會很有趣。我將不得不提出一個關於這個問題的新問題。 –