2012-05-18 9 views
2

我的倉庫的歷史是這樣的:如何重組一個Mercurial庫有兩個主要的平行分支

A -- B -- C (branch "foo") 
     \ 
     -- D (branch "bar") 

兩個分支都是「送貨」的分支,並有本質的不同前端以一個共同的後端。

以前的所有代碼都在一個分支中,foobar功能通過編譯器開關打開或關閉,但是我分支以便更容易地單獨使用每個功能。

問題是,常見的「後端」文件本身可能應該是一個單獨的分支 - 我經常想只是工作在這些常見的文件。由於我創建這些分支的方式,歷史有點搞砸了:在分支bar的過去,它曾經有foo的功能。

目前,我只是在一個分支上進行更改,然後使用hg transplant將相同的更改複製到其他分支。

相反,我希望能夠做出改變這樣:

 __ C __ D' (branch "foo") 
    / /
A -- B -- D   (branch "backend") 
     \  \ 
     -- E -- D'' (branch "bar") 

也就是說,工作在分支backend,然後在每個裝運分支(foobar),我使用hg merge backend

從我目前的情況到我所描述的最好的方式是什麼?我能想到的唯一的辦法是:

  1. 卸下所有foobar功能,並命名該分支backend

  2. 刪除舊的foobar分支。

  3. 手動添加foo功能到backend並命名該分支foo,並且同樣爲bar

有沒有更好的方法?

另外,這是正確的做法嗎?

回答

0

我選擇它的一個倉庫分成多個存儲庫,而不是幾個分支,具體如下:

  1. 我關上了bar分支。

  2. 我將原始存儲庫克隆到新的存儲庫backend

  3. 我刪除了所有與foo相關的代碼。

  4. 我將這些更改拉入主存儲庫,然後立即退出(因此foo代碼仍然存在)。這成爲我的foo存儲庫。

  5. 我將backend存儲庫克隆到一個新的存儲庫bar

  6. 我將現在關閉的bar分支中的所有文件複製並粘貼到bar存儲庫中。

這一直在我的歷史foo,失去了歷史的連續性bar(儘管所有的歷史仍然存在,如果我需要的話);現在foobar都是backend存儲庫的克隆,並進行了修改,這正是我想要的。

1

分支機構有多少個變更集foobar?後端(移植)變更集與前端變更集分開嗎?

如果變更並不多,而且他們是乾淨的,那麼你可能想這樣做:

 C -- 1 -- 2 -- D -- 3 (branch "foo") 
    /  
A -- B ----------- C" -- D" (branch "backend") 
     \  
     C' -- 4 ------ D' --- 5 (branch "bar") 

(這裏A,B,C,d是後端有關; 1,2,3是FOO有關; 4,5條相關)

- 即創建一個基於foobar最近的共同祖先的BRACH backend,然後移植所有後端相關的變更有。從這時起,您可以將backend合併到任一分支中。

+0

不幸的是,這不是乾淨的。兩個分支都有很多變更集。我認爲最主要的問題是'foo'和'bar'最近的共同祖先有*'foo'和'bar'相關的東西。我想要一個新的分支,只是*有後端的東西;但是如果我從新的'backend'分支中刪除所有'foo'和'bar'的東西,那麼我將無法直接合併到任一分支中。 –

+0

@JesseBeder:是的,刪除可能會有問題。您可以從後端刪除所有內容,但後端在'foo',分支'backend'上,然後返回'foo'並退出刪除。這樣,下次將'後端'合併到'foo'中時,刪除就已經存在了。但是,這並不考慮'bar'。 – Helgi

+0

@JesseBeder:還有其他的方法:1)如果後端駐留在一個單獨的目錄下,你可以使用'hg convert'來過濾掉這個目錄的歷史記錄,然後'hg pull --force'到你的原始目錄作爲'後端'分支,或2)如果你不關心歷史,只需將後端的最新狀態複製到新的'後端'分支,並從那裏開發出來。哪種選擇最適合你? – Helgi

相關問題