【问题标题】:Safe way to purge history - Mercurial清除历史记录的安全方法 - Mercurial
【发布时间】:2017-06-19 19:47:13
【问题描述】:

我将一个项目克隆到我的本地目录并进行了很多更改。我当前的目标是将更改的代码推送到远程存储库中的新分支。最终这个新分支将被合并回默认值。

我的问题是,由于过去几周尝试恢复一些丢失文件的愚蠢努力,我最终得到了一些我不想公开显示的分支名称。

这是我所拥有的:

$hg branches  
dev-v02  197:xxxxx  
dev2     194:xxxxx  
dev      183:xxxxx  
qa       189:xxxxx

$hg branch  
dev-v02

我的问题是,如果我通过“hg push --new-branch”将我当前的分支 dev-v02 推送到远程存储库,并且该分支稍后被合并回默认值,那么不需要的分支是否会出现在默认?如果是这样,有没有一种安全的方法来清除它们? 我不想放弃我的更改。我只是不希望以后从远程存储库克隆项目的人在“hg 分支”或“hg his”命令中显示不需要的分支。我在网上搜索并找到了“hg strip”,但我无法从文章中判断它是否也会删除我所做的更改。谢谢。

编辑:我刚刚按照 kevin 和 chessbot 的建议通过“hg clone -r 197 original-dir dest-dir”克隆了我的本地存储库,现在 hg 分支显示:
dev-02 192:xxxx
qa 187:xxxxx(非活动)
我猜“qa”仍然存在,因为我已将它作为 QA 分支推送到远程并稍后关闭它,我只需要忍受它。从现在开始,我将从这个新目录推送。谢谢大家的帮助。

【问题讨论】:

    标签: mercurial


    【解决方案1】:

    尝试hg push --new-branch -b dev-v02 指定您只推送该分支。

    (参见:https://www.mercurial-scm.org/repo/hg/help/push

    您可以做的另一件事是:在您的机器上本地克隆存储库,删除您不想要的分支,然后将该克隆推送到服务器。然后,您可以在本地保留您的历史记录,而不会将其推送给其他人。

    【讨论】:

    • 刚刚编辑了我的问题,以便更清楚地说明我真正关心的是,后来从存储库克隆我的项目的人不会在他们的“hg his”命令中看到那些不需要的分支。如果“hg push --new-branch -b dev-v02”可以解决问题,我已经找到了我的解决方案。你能证实吗?抱歉,但此时我害怕“尝试”任何事情。
    • 刚刚通过一个测试项目确认了它的工作原理。如果您愿意,我可以发布我的测试代码。
    • 谢谢。我只是尝试按照建议有选择地在本地克隆我的存储库,它可以工作。
    【解决方案2】:

    视情况而定。

    分支与提交永久关联。分支是提交的一部分,并有助于散列。更改过去提交的分支将改变从那时起的所有提交哈希。这与 Git 完全不同,在 Git 中,分支只不过是指向 HEAD 的临时指针。这种指针在 Mercurial 中实现为书签。

    如果不需要的分支出现在您想要发布的提交(祖先)的提交上,那么除了使用全新的哈希重新创建历史记录之外,您几乎无能为力。这可以(例如)使用hg exporthg import 以及本地克隆和(可能)一定数量的shell 脚本来完成。更有效的是,您可以使用the convert extension 来自动化该过程。由于这会更改提交哈希,因此如果任何提交已公开分发,则可能会导致严重问题。

    如果您对共享违规提交没有兴趣,您可以直接不发布它们。这可以通过选择性推送来完成。但是,由于每次推送时都必须手动排除这些提交,因此克隆和剥离(或使用 -r 标志选择性地克隆)可能更安全。然后,您可以不受惩罚地从您的部分克隆中推送。假设您有足够新的 Mercurial 版本,您还可以强制提交到秘密 phase,这样它们就不会被推送:

    hg phase -fs revisions
    

    【讨论】:

      【解决方案3】:

      您不想使用hg strip,因为它会从历史记录中永久删除提交(请参阅 Mercurial wiki 中的 Editing History

      如果我是你,我会关闭分支:

      hg up -C badbranch
      hg commit --close-branch -m 'close badbranch, this approach never worked'
      hg up -C default
      

      (来源:Mercurial wiki 中的 Pruning branches

      关闭分支后,hg branches 不再显示。

      如果您确实想查看已关闭的分支,请使用-c 参数:

      hg branches -c
      

      缺点:

      hg his 仍然显示关闭的分支。

      您可以使用-b 参数来仅显示默认分支:

      hg his -b default
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-10
        • 1970-01-01
        • 2011-04-18
        • 1970-01-01
        • 2013-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多