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

时间:2017-07-29 13:58:13

标签: version-control mercurial

在我正在进行的项目中(比如名字是“rinjani”),我们有多个mercurial回购(几乎10个单独的回购!),最近我们想将它转换为单个回购。

实际值:

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

预期:

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

最好(最安全)的方法是什么?我已经在blogpost之后阅读了这个内容,但仍然不确定这是否可行,因为这个例子仅展示了两个单独的回购。当然,我们希望保持每个回购的历史/变更集完整无缺。

1 个答案:

答案 0 :(得分:2)

博客文章是执行此操作的基本方法,尽管可以使用mv简化hg addremove --similarity 100hg rename步骤。

基本步骤:

  1. 创建新存储库。
  2. 强行拉出其中一个旧存储库。
  3. 更新提示并将旧存储库文件重命名为新位置。
  4. 提交
  5. 对其他存储库重复2-4次。
  6. 将所有内容合并在一起。
  7. 示例:

    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>
    

    然后&#34; hg merge&#34;每个人都在一起。

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

    在使用上述方案准备合并三个存储库之后,这是一个非常简单的图形:

    @  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