2017-07-29 81 views
0

在我目前正在開展的項目中(比如名稱是「rinjani」),我們有多個mercurial回購(近10個獨立回購!),最近我們希望將其轉換爲單個回購。Mercurial(hg):將多個回購轉化爲單個回購

實際:

- rinjani-a 
- rinjani-b 
- ... 
- rinjani-g 

預計:

rinjani 
├── rinjani-a 
├── rinjani-b 
├── ... 
└── rinjani-g 

什麼是最好的(最安全)的方式來做到這一點?我已閱讀以下blogpost,但仍不確定這是否是要走的路,因爲這個示例僅用於展示兩個單獨的回購。當然,我們希望保持每個回購的歷史/變更集完整。

回答

2

雖然可以使用hg rename簡化mvhg addremove --similarity 100步驟,但博客帖子是執行此操作的基本方式。

基本步驟:

  1. 建立新的版本。
  2. 強制拉出其中一箇舊版本庫。
  3. 更新到提示並將舊的存儲庫文件重命名爲新的位置。
  4. 提交
  5. 對其他存儲庫重複2-4。
  6. 將所有內容合併在一起。

實施例:

hg init rinjani 
cd rinjani 
hg pull -f <path_to>\rinjani-a 
hg update tip 
md rinjani-a 
hg rename * rinjani-a 
hg ci -m "renamed rinjani-a" 
<repeat for other projects> 

然後 「汞合併」 每個磁頭在一起。

當然,這是完全安全的,因爲所有的修改操作都只對新的存儲庫進行。如果你犯了一個錯誤,你總是可以重新開始!

這裏是一個非常簡單的圖形可能是什麼樣子準備三個不同版本庫後,使用上述方案進行合併:

@ 5:renamed rinjani-c files 
| 
o 4:rinjani-c file 

o 3:renamed rinjani-b files 
| 
o 2:rinjani-b file 

o 1:renamed rinjani-a files 
| 
o 0:rinjani-a file 

然後合併頭(REV 1,3,5在這種情況下)。關鍵的一點是一起合併他們修改獨立歷史的頭前:

@ 7:Merge 
|\ 
| o 6:Merge 
| |\ 
| | o 5:renamed rinjani-c files 
| | | 
| | o 4:rinjani-c file 
| | 
| o 3:renamed rinjani-b files 
| | 
| o 2:rinjani-b file 
| 
o 1:renamed rinjani-a files 
| 
o 0:rinjani-a file 
+0

好吧,'md'是'mkdir'的別名,我想?例如,因爲'hg rename * rinjani-b',因爲其他回購重複步驟2-4,我會遇到一個問題,例如,將'rinjani-a'移動到'rinjani-b'內。另外,如果我最終每個回購有多個頭,我應該合併哪一個?小費? –

+0

@GlennMohammad當您執行每個回購的'hg pull -f'時,它們將顯示爲不合並的獨立歷史記錄。直到最後才合併頭部。所以'hg rename * rinjani-b'不會看到'rinjani-a'文件。一旦所有的歷史被重新命名爲其最終位置,將每個歷史的頭部合併在一起,例如,將rinjani-b歷史合併到rinjani-a中,然後將rinjani-c合併到該結果中,等等。 –

+0

'md'和'mkdir'是等效的...至少在我使用的Windows上。 –