清除历史记录的安全方法 - Mercurial

Safe way to purge history - Mercurial

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

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

这是我拥有的:

$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 branches" 或 "hg his" 命令中显示不需要的分支。我在网上搜索并找到 "hg strip" 但我无法从文章中判断它是否也会删除我所做的更改。谢谢

编辑:我刚刚按照 kevin 和 chessbot 的建议通过 "hg clone -r 197 original-dir dest-dir" 克隆了我的本地存储库,现在 hg branches 显示:
开发-02 192:xxxxx
qa 187:xxxxx(无效)
我想 "qa" 仍然存在是因为我将它作为 QA 分支推送到远程并稍后将其关闭,我只能忍受它。从现在开始,我将从这个新目录推送。谢谢你们的帮助。

您不想使用 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

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

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

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

视情况而定。

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

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

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

hg phase -fs revisions