Mercurial (hg):将多个回购协议转换为单个回购协议

Mercurial (hg): transform multiple repos to single repo

在我目前正在进行的项目中(例如,名称是 "rinjani"),我们有多个 mercurial 存储库(将近 10 个独立的存储库!),最近我们想将其转换为单个存储库。

实际:

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

预计:

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

最好(最安全)的方法是什么?我已经在 blogpost 之后阅读了这篇文章,但仍然不确定这是否是可行的方法,因为那里的示例仅展示了两个单独的回购协议。当然,我们希望保持每个回购的 history/changesets 完好无损。

博文是完成此操作的基本方法,尽管 mvhg addremove --similarity 100 步骤可以使用 hg rename.

进行简化

基本步骤:

  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>

然后"hg merge"每个人头在一起

当然这是完全安全的,因为所有修改操作都只对新存储库进行。如果你犯了错误,你总是可以重新开始!

使用上述方案准备好要合并的三个存储库后,一个非常简单的图表可能如下所示:

@  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)。重点是修改独立历史的头部before合并它们:

@    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