2010-03-31 72 views
4

我傾向於使用來自Subversion的Mercurial,並且我想維護一個像Subversion一樣的集中式工作流。這是我在想什麼:這是一個很好的集中DVCS工作流程嗎?

stable (clone on server) 
    default (branch) 
    development (clone on server) 
     default (branch) 
     bugs (branch) 
      developer1 (clone on local machine) 
      developer2 (clone on local machine) 
      developer3 (clone on local machine) 
     feature1 (branch) 
      developer3 (clone on local machine) 
     feature2 (branch) 
      developer1 (clone on local machine) 
      developer2 (clone on local machine) 

就分支機構與克隆而言,這個工作流程是否有意義?我有東西嗎?

此外,'穩定'克隆是釋放。 「默認」分支是否是發佈以及所有其他分支最終被合併到了哪裏?

回答

1

你在這裏做的是建立一個workflow of merges,應該在倉庫之後遵循倉庫(分支)。

關於工作流,我會採取錯誤的分支/回購外發展,因爲它通常是您隔離了一些bug修復

stable (clone on server) 
    default (branch) 
    bugs (branch) 
     developer1 (clone on local machine) 
     developer2 (clone on local machine) 
     developer3 (clone on local machine) 
    development (clone on server) 
     default (branch) 
     feature1 (branch) 
      developer3 (clone on local machine) 
     feature2 (branch) 
      developer1 (clone on local machine) 
      developer2 (clone on local machine) 

穩定後做了一個分支(即釋放到生產)的分支,而不是全部錯誤修復最終將在開發分支中進行,因爲其中一些修補程序僅針對當前版本進行了修改,而目前的開發可能已經使其過時。

是否有意義的'默認'分支是釋放和所有其他分支最終合併到什麼?

我也將使用第一個「默認」分支(穩定版的正下方)作爲合併分支,因爲不是每個功能將在合併分支結束:其中的一些目前開發的功能太複雜,無法及時準備下一個版本。

0

很大程度上取決於團隊中的開發工作流程。在我工作的最後一個(小)團隊中(我們使用svn) - 單獨的bugs分支最終變得多餘,錯誤在他們所屬的分支中被固定。此外,我們沒有單獨使用stable分支,而是穩定了發行版的分支。

8

在Mercurial中,分支(在同一個存儲庫中使用hg分支創建)目前是不可逆的。一旦引入,您只能通過執行歷史重寫將它們從分支名稱空間中移除。這就是爲什麼如果項目生命週期很短(只有少數功能分支)或分支足夠通用以保持多年(如「穩定」,「錯誤修正」等),我纔會創建真正的分支。據我所知,分支機構(和所有其他產品一樣)在沒有你的控制的情況下在本地創建,所以如果有人決定使用分支,該分支將在拉/推之後顯示在主存儲庫中。

效果是 - 在你的結構 - 從發展拉入穩定後,你也會得到特徵1特徵2分支合併爲穩定,是相當無用的。拉穩定發展因爲你固定錯誤穩定版本也將合併分支錯誤發展。您可以嘗試通過創建穩定庫,將其克隆到發展,分公司特徵1發展和拉發展穩定(提交這些步驟之間的一些變化):分支名字會與非活動的頭出現在穩定雖然你它合併:

 
stable $ hg branches 
default      4:1c3cd0d1a523 
feature2      3:82879465c5f3 
feature1      2:5d7480426f21 (inactive) 
bugs       1:116860d2d85e (inactive) 

我記得,Git是能夠刪除分支,但水銀有一定的發展能上的貓討論這個話題;我不確定這是否仍然是最新的,所以如果我錯了,請糾正我。

[編輯]根據Mercurial wiki中的Pruning Dead Branches,有4種方法可以「移除」一個分支。真正永久的唯一途徑刪除分支名稱,而不僅僅是關閉(取消激活),它是通過用已清除的歷史記錄替換存儲庫。

從我所聽到和看到的,使用Mercurial時創建克隆而不是分支更常見。我記得去年當我從SVN轉到Mercurial時,和你有同樣的想法。通常的做法與中央版本控制不同,因爲分支可以在任何時候發生,而無需集中控制它,所以克隆是「分支」以不污染分支名稱空間並保持開發分離和靈活的首選方式(您將始終檢索完整的存儲庫,如果你拉/克隆包括所有分支機構,如果你只是想分支測試的東西,你將不得不選擇一個獨特的分支名稱是永久性的,因此將出現在項目中的每個人)。儘管這種方法似乎浪費了磁盤空間,並且需要跟蹤分支機構的位置(通常位於用戶帳戶和IDE內的某個項目文件夾中),但它似乎是一種更加靈活和實用的處理方式分支機構。 (它讀取比當你真正自己使用它更困難)

已經有一些使用水銀較小的項目,這是我們公司什麼工作至今(每個項目只有幾個活躍的開發者):

在服務器上:

項目名稱,主要
發展被推到並從那裏拉;這就是「權威」開發「分支」,以保持團隊的庫同步

項目名稱穩定
如果一個版本得到釋放/部署這就是- 主被推向;只有錯誤修正是在- 穩定的完成,然後拉回到- 主要:根據Mercurial Guide by Bryan O'Sullivan的建議,修正了被認爲更穩定的版本(例如,以前的版本)通常可以撤回到開發分支中,但開發分支中的更改可能包含更新的不穩定功能,除非發佈發佈(或類似),否則不應將其拉入維護分支。

本地開發者的機器:

項目名稱,主要克隆一次,正在處理和同步做一個拉(+合併),並定期推回服務器。

如果有一個功能「分支」需要我們克隆- 主(本地或服務器),並將其命名爲克隆「項目名稱 - featuredescription」。爲了備份目的或集中式共享,我們還在服務器端創建一個克隆並推送到那裏。如果要素是準備- 主,我們拉-featuredescription到我們當地- 主,合併更改,拉- 主從服務器,再次合併,推動- 主回服務器。如果變化發生- 主而我們在-featuredescription工作,我們可以很容易地從- 主拉和合並的變化(不推回- 主但因爲我們不希望該功能在那裏然而)。

與真正的分支相比,不利的一面是,在與父母合併後,您無法輕易識別出哪些變更集來自哪裏。但是這對我們來說還沒有問題(提交消息足夠有用,或者一旦將特徵分支與其父庫進行合併,則特徵分支的分離是無趣的)。

思考更大的項目我想出了以下應該工作的方案(但我還沒有使用它)類似於集中版本控制。它依賴於對服務器端「權威」存儲庫的有限寫訪問,因此只有特權開發者(項目負責人)纔可以合併並推送到那裏。此外,還有一臺CI服務器作爲另一個存儲庫的網守- 主要測試的,它是- 主要的一個子集,僅包含CI批准的變更集,並略有延遲。

在服務器:

項目名稱,主要
發展;只有少數人有寫權限,主要變化需要由他們拉動;他們是在什麼特徵的分支合併

控制

項目名稱,主要測試
發展;沒有人應該在這裏寫,除非出現了問題,因爲測試意味着持續集成系統,成功地建立了- 主推那個版本爲- 主要測試,所以在這裏的代碼進行驗證,不應該打破編譯或測試

的projectname穩定
的projectname穩定測試
要穩定的 「分支」 相同的策略;和以前一樣,我們推- 主上發佈和bug修正工作,穩定版穩定版,測試是CI批准

當然,我們需要有多個倉庫的地方在那裏的球隊/開發者實際上可以推動他們的日常工作,因爲-主現在僅用於權威性更改(當然,他們可以完全在本地工作,但他們必須同步某處,如果他們不喜歡使用hg serve彼此同步或設置自己的服務器或關心備份)。

減少提交和存儲庫/分支的另一個選擇是使用mq擴展來處理修補程序隊列。但是,我發現使用克隆或分支更容易,至少對於小型項目來說。

相關問題