2013-05-18 53 views
3

我有一個項目的4個版本。版本1-3是最初不受源代碼控制的「原型」(它們作爲文件系統中的單獨目錄而存在)。版本4自成立以來一直受到源代碼控制,現在已有很長的提交歷史。在Mercurial中,如何組合無關的存儲庫,只留下一個根?

我想這些結合起來,使版本1-3成爲個人的變更,其中每一個都是以前的後裔。版本4的根目錄應該成爲版本3的後代(當然也不會崩潰版本4的歷史記錄)。

所有變化都是私人的,不公開的(沒有與改寫歷史,因爲它是沒有問題的)。

我到目前爲止已經完成,並試圖:
1.我建立新的汞庫的原型版本的目錄
2.我克隆版本4
3.我拉庫(與hg pull --force )版本1-3的不相關存儲庫到克隆的存儲庫中。

這給了我4無關「根」(沒有祖先的變更)在單個存儲庫。當我把它們結合起來時,我不想記住這四個根。 hg rebase應該讓我移動變更並銷燬原件,而不像hg merge

這裏我將使用101作爲「版本1」(這是沒有父代的單個變更集)和102作爲「版本2」的修訂版的修訂版。

嘗試1:我嘗試hg rebase -b 102 -d 101但得到的輸入反應nothing to rebase。據推測,這是因爲他們沒有共同的祖先(我喜歡這種感覺不一致... -b 102將包括所有的祖先除了共同的祖先,這將是沒有在這種情況下)。

嘗試2:我嘗試hg rebase -s 102 -d 101 。這會導致合併衝突。我做了hg revert --all --rev 102hg resolve -m以表明我更喜歡所有衝突中的「版本2」(儘管我懷疑這是否是在存在增加/刪除的情況下更偏向於另一個父節點的正確方法?)。但是當我提交時,我沒有線性歷史記錄---修訂版102仍然存在!

回答

2

如果我做hg rebase --continue作爲最終的指令(而不是hg commit),那麼它完美的作品。

我沒有閱讀文檔的最後一部分:
http://www.selenic.com/mercurial/hg.1.html#rebase

+0

如果您在合併,重新綁定或移植時合併衝突,則應在手動解決這些衝突之前手動解決這些衝突。否則,您的變更集不一致。 –

+0

在我的情況下,'hg revert --all --rev 102'是我想要如何解決衝突的方法「手動」 – Ein

+0

@Ein,「文檔的最後部分」是什麼是重要的關鍵爲你解決這個問題?謝謝 – DaveInCaz

1

據我所知,這是更好地在基礎重建,而不是恢復到一個版本使用--tool "internal:other"

0

替代rebase已爲我工作的是使用hg convert擴展名和--splicemap選項。

儘管convert旨在從其他源控制系統(如SVN)實際遷移,但它也可以將hg「轉換」爲hg。

的`--splicemap``選項允許您明確設定變更集之間的父/子關係。我已經使用它來消除源自不相關存儲庫的分支。 Mercurial似乎處理得很好,例如,在convert/splicemap操作之後,具有相同名稱的文件看起來具有連續的歷史記錄。

我不確定這是否必定是比rebase更好的解決方案。對於奇怪的情況(?)它可能更適合小生境。一個明顯的缺點是,對於大型存儲庫,轉換過程可能需要很長時間才能運行。

Splicemap documentation

相關問題