2010-10-17 65 views
8

我有3個版本庫,每個版本都使用相同的代碼庫創建,但不同的版本足以保證不同的版本庫。我的「夢想」工作流程是在開發倉庫中完成工作,然後將這些更改引入其他倉庫。我知道我可以像這樣做:從特定版本拉文件 - mercurial

hg pull -r X -f repo 

但是這會給我所有的變更多達十是否有可能只是把所有的變更集從一個特定的版本,甚至從各種版本的?

回答

7

如果你想抓住內容某些變更集,並將它們應用到任意結帳(注:所產生的變更將不同的變更,即使他們做出同樣的變化),看看在transplant extension

+0

這幾乎給我我想要的,除了發生衝突時,我得到這些.rej文件,而不是採取我合併工具。你知道任何簡單的方法來處理這些.rej,而不是手動解析它們並解決衝突嗎? – mdonovan2010 2010-10-17 23:45:57

+0

對於希望解決問題的新讀者:請參閱下面我的更新答案,瞭解內置的,運行良好的解決方案。 – Lstor 2012-10-15 09:12:33

8

有沒有櫻桃選擇mercurial修訂(這就是你所提出的工作流程稱爲)。有一些不太好的方法可以做到這一點:export + import(或者導出+導入的便捷包裝器,稱爲移植),但是那裏有一個相同的變更集,在多個存儲庫中有不同的哈希值,沒有好處方式來表示如果/當您嘗試再次移動更改時。

更好的方法是修改您的工作流程,以便當您想要移動所有祖先時可以移動,並且您通過有意識地選擇變更集的祖先來執行此操作。

例如,如果您正在修復開發存儲庫中的錯誤,並且所有三個「其他」存儲庫不只是更改開發存儲庫的更改的父版本tip。首先做一個hg update -r THE_REVISION_WHERE_THE_BUG_WAS_ADDED,然後修復你的bug,然後提交。你會看到一條消息new head created,這是預期的。

現在,您已經將修復程序作爲變更集的唯一父變體引入了該變更集 - 該變更集必須存在於其他3個存儲庫中,否則他們不會有該錯誤。所以現在你可以將新的變化集合到「3」其他的倉庫中,而不用把所有其他的東西帶到開發中去。然後,您在這四個存儲庫中的每一箇中快速執行hg merge,將缺陷修復程序混合到其可部署的tip中。

掌握如何構建具有通用功能但各自定製的存儲庫可能會有點棘手,但如果您正確構建正確的操作,則可以使用推,拉和合並完成所有的intra-repo遷移,而且不必修復兩次錯誤,在不同的變更集中使用相同的代碼,或重新執行存儲庫的定製。

作爲一個說明,在開始修復它之前,bisect命令很好地回答了「在哪裏引入了該錯誤」問題。

+0

如果我正確理解這一點,那麼如果所有存儲庫都可以追溯到通用變更集,那麼此工作流程將起作用?在我的情況下,情況並非如此。 – mdonovan2010 2010-10-17 23:17:30

+0

是的,我認識到它不是,但我的意思是,他們應該沒有聽起來「審判」。無論您的部署是如何定製的,如果它們具有一些共同的代碼,它們應該是具有自己的自定義更改集的克隆 - 或者應該共享subrepos,前提是它們之間有一些通用的庫代碼。這將是一個重要因素,但它會讓你接受上面提到的「夢想」工作流程。 – 2010-10-18 02:00:35

+0

是的你的權利。我遲到了控制這些網站的版本,雖然...... mercurial似乎是我必須做的完美選擇,但重構所有事情只是爲了實現我的夢想,可能不會讓我的僱主非常高興;)謝謝你你的意見,這無疑幫助我更好地理解Mercurial的工作方式) – mdonovan2010 2010-10-18 02:41:47

7

已更新回答:從Mercurial 2開始,您可以使用'graft'命令,該命令可以很好地工作。它使用一些內部合併功能來確保您可以手動處理任何衝突。如果沒有Mercurial無法自行解決的衝突,則新的變更集會自動在當前修訂版本的頂部進行櫻桃挑選並提交。