【问题标题】:Mercurial clone cleanup to match upstreamMercurial 克隆清理以匹配上游
【发布时间】:2011-09-26 23:35:23
【问题描述】:

我有一个存储库的 hg 克隆,几个月来我在其中进行了许多本地更改,并将它们推送到我在谷歌代码上的克隆。不幸的是,作为一个菜鸟,我在默认分支上提交了一大堆更改。

现在我想确保我当前的默认值与上游完全相同,然后我可以正确地分支默认值并且只在分支上工作..

但是,我该如何进行清理呢?

供参考,我的克隆是http://code.google.com/r/mosabua-roboguice/source/browse

PS:我在 git 上遇到了同样的问题,并得到了清理:Cleanup git master branch and move some commit to new branch?

【问题讨论】:

    标签: mercurial


    【解决方案1】:

    首先,在默认分支上提交 没有错。您通常不希望为 Mercurial 中的每个任务创建单独的命名分支,因为命名分支是永远存在的。您可能想查看更接近 git 分支的书签功能(“hg 帮助书签”)。因此,如果您现有变更集的唯一问题是它们位于默认分支上,那么它们确实没有任何问题。不用担心。

    但是,如果您真的想重新开始,那么显而易见、直接的做法就是从上游重新克隆。您可以通过移动现有的 repo 和重新克隆来保留杂乱的变更集。然后将旧仓库中的变更集移植到您选择的分支上的新仓库中。

    如果您不想为新克隆花费时间/带宽,可以使用(高级、危险、不适合初学者)strip 命令。首先,您必须启用mq 扩展(谷歌它或查看手册——我故意不在这里解释它,因为它是危险)。然后运行

    hg strip 'outgoing("http://upstream/path/to/repo")'
    

    请注意,我在这里使用的是 Mercurial 1.7 中添加的 revsets 功能。如果您使用的是旧版本,则没有简单的方法可以做到这一点。

    【讨论】:

    • 好的...那么我将如何在我的克隆中维护一个分支或任何与上游完全相同的分支,这样我就可以将它用作我的开发的基础并保持它干净并保持仅从上游拉入。还是有其他方法我应该这样做?因为目前由于很多冲突,我很难从上游拉入..
    • +1 感谢 Greg 指出默认值的更改是可以的。命名分支永远存在,您的上游可能不想要它们。
    【解决方案2】:

    最好的方法是使用两个克隆。使用远程仓库时,我无法控制我总是保留一个名为“virgin”的本地克隆,我不会对其进行任何更改。例如:

    hg clone -U https://code.google.com/r/mosabua-roboguice-clean/ mosabua-roboguice-clean-virgin
    hg clone mosabua-roboguice-clean-virgin mosabua-roboguice-clean-working
    

    请注意,因为 Mercurial 对本地克隆使用硬链接,并且因为第一个克隆是带有 -U 的克隆(没有工作目录(git 术语中的裸仓库)),所以这会占用 no 额外的磁盘空间。

    在 robo-guice working 中随心所欲地工作并拉入 robo-guice virgin 以查看上游发生了什么,然后再次拉入 roboguice-working 以获取上游更改。

    您可以在事后通过创建远程 repo 的新克隆来执行此类操作,如果磁盘空间很宝贵,请使用 relink 扩展来关联它们。

    【讨论】:

    • 谢谢。这就是我最终基于新克隆所做的事情。清理旧的似乎很费劲。我更新了我必须在你的答案中使用的命令。
    【解决方案3】:

    前言 - 所有历史更改仅对未发布的存储库有意义。编辑本地历史记录后,您必须从头开始推送到 GoogleCode 的存储库(在 GC 上删除存储库,创建空的,推送)-否则您将在默认分支中再获得一个 HEAD

    曼弗雷德

    简单(但不短)的方式-仅默认+MQ

    1. 正如 Greg 所说,安装 MQ
    2. 将所有提交移到上游代码之上的 MQ 补丁中
    3. 将您的更改永远保留为路径
    4. 检查、编辑是否需要并在每次上游拉取后重新集成补丁(这样您自己的没有 MQ 补丁的 CG-repo 将与上游相同)

    更复杂 - MQ 在中间 + 单独的分支

    1. 以上
    2. 以上
    3. 创建命名分支,切换到它
    4. “完成”补丁
    5. 拉到上游,与您的分支更改合并(默认您的分支)
    6. 仅将您的更改提交到您的分支中

    变基

    1. 启用变基扩展
    2. 创建命名分支(其中包含变更集?TBT)
    3. 将您的变更集重新定位到新的祖先,测试结果
    4. 参见“更复杂”一章中的 5-6

    【讨论】:

    • 感谢您的回答。在这个阶段,它看起来工作量太大,我只是在上游重新克隆并遵循 Ry4an 的方法。
    【解决方案4】:

    也许你可以试试Convert extension。它可以使存储库处于更好的状态,同时保留历史。当然,修改完成后,您必须删除旧的repo并上传转换后的repo。

    【讨论】:

      猜你喜欢
      • 2011-06-29
      • 2010-12-18
      • 1970-01-01
      • 2011-09-30
      • 1970-01-01
      • 2017-02-25
      • 1970-01-01
      • 1970-01-01
      • 2011-06-09
      相关资源
      最近更新 更多