2017-07-29 58 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上。 –