這裏是我的解決方案的列表中複雜的順序,從最簡單的。
忘記歷史
最簡單的。將每個項目的默認分支的當前狀態置於新項目結構中。然後開始一個新的回購。
我們沒有被告知如何活躍的分支,但如果他們是積極的,你可以爲每個分支做相同的:
hg up null # not strictly necessary, but may avoid the impression that a branch started now.
hg branch <name>
<populate directory structure with the current state of a branch from each project>
hg commit
你仍然將有機會獲得歷史在原有項目的回購協議。你不能輕易做到的是將新的變更集與舊的歷史記錄進行比較。顯然,這種需求會隨着時間而減少,但對您而言可能很重要。
合併
通過合併回購保留歷史是可能的。首先,每個項目回購必須有所有它的文件移動到子目錄,以反映全球回購的預期結構:
for <each project>
md projdir
hg rename * projdir
hg commit
然後每個項目都可以被納入全球項目:
cd globalrepo
hg init
hg pull <first subproject>
for <other subprojects>
hg pull -f <subproject> # the -f is necessary because the projects are unrelated.
hg merge
hg commit
這應該給你一個完整的歷史合併。
當比較具有「舊」歷史記錄的文件時,請記住(或使用別名)爲具有--git選項(即diff和至少導出)的命令使用--git選項。請記住,雖然歷史可能完整,但可能會讓人困惑,因爲每個項目的歷史都是連續的。
使用Subrepos
有可能加入使用沿着你的建議行subrepos回購。儘管如此,subrepos意圖是不太活躍和獨立組件。在你的用例中,這些都不是真的。
在你的情況下,這些項目將不會是獨立的,因爲它們只用於新的全局回購的環境中,並且不與其他全球回購共享。
如果subrepos處於活動狀態,就像它們在您的用例中一樣,您必須警惕地記住提交subrepo和父repo。不記得這會導致刺激,因爲推動可能因多個頭部而中止。如果人A將變更集推送到subrepo而不推動父回購,則會發生這種情況;那麼人B更新到父回購(它不拉新的子回報變更集)的提示,並嘗試將他的提交推到相同的子報告上。如果你的團隊中的每個人都有能力處理汞,那麼對你來說可能會很好,但如果沒有,我建議不要在你的用例中使用subrepos。
如果有活躍的分支,該subrepos會留住他們,但全球回購不會看到他們,除非它也被分支:
cd globalrepo
hg up null # not strictly necessary, but may avoid the impression that a branch started now.
hg branch <branch>
for <each subrepo>
cd <project dir>
hg up <branch>
cd globalrepo
hg commit
我希望你的想法(未經測試,該位從記憶裏)。
最簡單的方法,在分支之間合併時沒有風險嗎? – 2014-09-29 19:34:16
@MaxenceCramet你將需要歷史來合併分支,所以你不能用'忘記歷史'方法來做到這一點。 [你沒有說你的工作流程需要現有分支之間的後續合併;我認爲他們將永遠是獨立的,就像產品發佈一樣。] – 2014-09-29 23:07:12