【问题标题】:How to keep changesets in phase “draft” on hg push?如何在 hg push 上保持变更集处于“草稿”阶段?
【发布时间】:2025-12-31 19:45:01
【问题描述】:

如何阻止 mercurial 在推送操作中将变更集置于“公开”阶段?我希望他们保持“选秀”。

我经常 rebase 和 histedit,而我推送到的存储库仅供我自己使用。而且必须一直改变相位是一件很麻烦的事情。

【问题讨论】:

    标签: mercurial push mercurial-phases


    【解决方案1】:

    文档没有明确显示的是:

    push 的阶段变化不是一个纯粹的本地决定。 – 在“上传”变更集之后,客户端向服务器询问有关提交阶段的更新,而服务器通常是告诉他们现在是“公开的”。

    因此,.hgrc-sn-p

    [phases]
    publish = False
    

    必须放在服务器上,这会抑制那里通常的相变。然后,服务器将以推送的方式报告阶段。

    Bitbucket 在 Settings → Repository details → Phases 下有一个选项。

    【讨论】:

      【解决方案2】:

      如您所见,将阶段保持在draft 的最直接方法是将远程服务器配置为“非发布”。

      但是还有第二种方法,如果由于任何原因无法将目标服务器设置为“非发布”,这可能对某些人有用:使用pull 而不是push。拉取是只读的,因此如果您可以设置工作流程(例如,通过本地别名)以便远程从本地存储库中拉取更改,它们将保持在阶段draft

      【讨论】:

      • 你建议使用“拉”对我有用。我尝试了上面列出的“非发布”设置,但它对我不起作用。现在我的“草稿”在服务器上保持这种状态。
      • 你怎么推才能让遥控器拉你?
      • 你不推,你 ssh 到远程并从那里拉。以交互方式或使用脚本。
      • 大多数不允许您编辑远程的 .hg/hgrc 的主机也不允许您使用除 hg serve 之外的交互式 shell 或命令。我认为可能有一些技巧可以让hg push 在拉模式下运行,就像hg clone 有硬链接模式和拉模式一样。嗯,太糟糕了。
      • 嗯,是的,您需要对目标服务器进行一些控制。如果您不想想要重新配置目标服务器,我的建议很有用,例如因为除了这种情况外,它应该充当发布服务器。 (顺便说一下,您也可以使用hg phase -f --draft 将某些变更集的阶段倒回到draft,对吧?)
      【解决方案3】:

      简答:不知道

      如果你想在本地和推送目标上重写历史,你必须

      【讨论】:

      • 我不想在 push-target 上重写。
      • @RobertSiemer - 你想要,重写 local only 没有意义
      • 是的,我确实想要,但这不是问题的一部分。
      【解决方案4】:

      https://www.mercurial-scm.org/wiki/Phases

      A repository is "publishing" by default. To make a repository non-publishing, add these lines to its hgrc configuration:
      
      
      [phases]
      publish = False
      

      【讨论】:

      • 好的。尝试推送第二个头,稍后在本地仓库中将其删除,然后将 this 更改推送到远程!
      • @LazyBadger:为了什么?
      • @RobertSiemer - 好吧,“重写历史”的案例之一 - 我只是偶然发现它,当测试风暴的简单方法时
      • @LazyBadger 是的,有问题。