2012-01-31 36 views
6

我是DVCS的新手,所以我可能誤解了一些概念和術語,但這是我想要實現的想法,而我試圖找出Bazaar或Mercurial是否以直接的方式支持這一點:避免將不需要的本地歷史記錄推送到Bazaar或Mercurial的主要存儲庫

存在經過良好測試的代碼的主要存儲庫。假設我從本地存儲庫中克隆(或者拉或分支,或者術語是什麼)到本地存儲庫中,然後每天當我處理代碼時,我會在本地提交更改,有時一天會多次執行更改。

當我完成所有更改和測試後,我只想得到放入主存儲庫的每個文件的最新(本地)提交版本,沒有我在本地提交的幾十個中間版本調試和單元測試。

從我一直在閱讀的內容來看,顯然這些不完整的版本的整個歷史記錄會反映到主存儲庫中,如果我推動它的話。一些互聯網文章似乎表明,如果處理得當,rebase可能會解決這個問題,但不清楚是否/如何做到這一點,因爲rebase更像是避免分支/合併歷史記錄而不是避免提交一大組中間版本。

回答

5

一些集市選擇。

  1. 如果你想擺脫幾十個本地提交,你實際上扔掉了歷史。一種做法是使用bzr uncommit命令。例如。

    bzr uncommit -rbranch:https://url_to_mainrepo 
    

    (直到你到達主倉庫的修訂扔掉rivisions。不要擔心它會告訴你會怎樣做,做之前與您確認)

    然後,你可以做與其他所有人進行的一次新的合作歸於一個。

  2. 集市通常隱藏合併修訂。一種方法可以將你的微小提交匯總到一個合併版本中,這樣可以保留主倉庫的本地分支/結帳。然後,當您準備好時,bzr merge將更改爲您的本地主repo克隆,然後提交合並的修訂。

    這樣你仍然保留所有的歷史,但所有的小修改整齊地彙總到合併修訂。當你想要的時候,你仍然可以看到那段歷史。

這裏是如何看不出合併版本的例子:

$ bzr log 
------------------------------------------------------------ 
revno: 2 [merge] 
message: 
    summary of the things I did 
------------------------------------------------------------ 
revno: 1 
message: 
    some change on the mainline 
------------------------------------------------------------ 
Use --include-merged or -n0 to see merged revisions. 

這裏是怎麼看的合併版本的例子:

$ bzr log -n0 
------------------------------------------------------------ 
revno: 2 [merge] 
message: 
    summary of the things I did 
    ------------------------------------------------------------ 
    revno: 1.1.2 
    message: 
     my first step 
    ------------------------------------------------------------ 
    revno: 1.1.1 
    message: 
     my second step 
------------------------------------------------------------ 
revno: 1 
message: 
    some change on the mainline 
+0

你說這是「通常」隱藏,這意味着不總是隱藏? ...在選項2中,合併並提交到主存儲庫完成後,合併前本地提交的中間版本的文件內容是否可以通過間接方式(例如日誌文件)在主repo中訪問? – Gigatron 2012-02-02 02:03:38

+0

添加了如何查看或不查看合併修訂的示例 – AmanicA 2012-02-02 14:19:04

+0

OK,因此可以在日誌中看到註釋和元數據,但本地簽入版本的半成品的實際文件數據在主體中將不可見回購,對嗎? – Gigatron 2012-02-02 20:21:15

5

你要找的關鍵詞是崩潰(水銀)或壁球(GIT)。恐怕我不知道這個在集市上的通常名詞是什麼。

在Mercurial中,您可以使用histedit extension(自Mercurial 2.3以來的捆綁擴展)將一系列變更集合摺疊爲單個變更集。它提供了第三方collapse extension中功能的超集。

rebase extension(另一個標準擴展名)與--collapse標誌具有相同的功能。你完全正確的是,重新設置通常是爲了避免不必要的合併,但它不知何故也被用於collapsing (and editing) changesets in Git。 Mercurial的histedit extension是在Git中的交互式rebase命令之後建模的。

+0

不幸的是,許多Mercurial歷史編輯擴展都會遇到問題,如果您已經完成了諸如從主線合併到您的分支的事情。 – 2012-07-21 04:09:31

+0

不幸的是,使用'hg histedit'或'hg collapse'在Mercurial中摺疊變更集會丟失有關文件重命名的信息,因此會丟失有關重命名文件的編輯歷史記錄。 (它看起來像是最近添加了整個內容的新文件)。 – Iodnas 2012-12-10 17:21:59

+0

@lodnas:我無法用'hg histedit'重現這個問題 - 請提交一份錯誤報告,說明如何觸發這個問題:http://bz.selenic.com/(我還沒有測試過崩潰同樣的方式,這是第三方擴展,可能比現在標準的histedit擴展更有問題)。 – 2012-12-11 08:42:33

1

在商場,這是通過處理一個單獨的「克隆」(即bzr branch URL)在本地的主要回購,然後您創建本地功能分支,您在其中使用多個提交工作。當您準備將該工作轉移到主倉庫時,您將bzr merge特徵分支拖入主倉庫。這會在主分支中留下一個修改後的工作樹,然後您將其提交到您的官方主庫。此提交包含功能分支的修訂歷史記錄,但通常隱藏在bzr log或其他日誌歷史記錄視圖中。

+0

你可以用命名分支來完成同樣的事情,而不需要額外的克隆主要是在本地進行回購,至少在Mercurial中,我相信git(同樣在CVS和SVN中,但這不是你所問的)。你可能只需要訓練其他用戶執行「hg log -b default」,以便他們只查看主分支的歷史記錄,而不查看具有所有中間簽入的任務分支。 – 2012-07-21 04:01:51

相關問題