Mercurial 是否有任何方法可以删除已推送到所有开发人员共享的回购协议的分支?

Mercurial 是否有任何方法可以删除已推送到所有开发人员共享的回购协议的分支?,mercurial,Mercurial,我不小心把一家分行推到了回购协议上。我是否可以修改回购协议(并撤销分支机构)?关闭它不是一个解决方案。如果上面Jason评论中描述的“退出”选项不适合您,您可以使用hg convert重新创建回购,直到错误推送点,该选项(尽管名称)也适用于hg 例如hg convert-r在错误推送/path/to/original/path/to/new之前 您可能需要使用usebranchnames和clonebranches设置。我们曾经遇到过类似的问题,当时我们必须从服务器repo中删除所有开发人员定期

我不小心把一家分行推到了回购协议上。我是否可以修改回购协议(并撤销分支机构)?关闭它不是一个解决方案。

如果上面Jason评论中描述的“退出”选项不适合您,您可以使用
hg convert
重新创建回购,直到错误推送点,该选项(尽管名称)也适用于hg

例如
hg convert-r在错误推送/path/to/original/path/to/new之前


您可能需要使用usebranchnames和clonebranches设置。

我们曾经遇到过类似的问题,当时我们必须从服务器repo中删除所有开发人员定期从中提取的分支。退出不是一个选项,因为有问题的分支已经被所有人拉了出来

我们剥离了服务器repo中的分支(
hg strip
)。从现在起,如果开发人员尝试推送,他会收到一条消息“推送创建新的远程分支”,即使它们实际上没有创建任何分支。我们使用
strip
命令创建了一个批处理文件,将其分发给开发人员,并解释了“新的远程分支”是运行批处理文件的信号


在每个人都摆脱分支之前,这种方法需要一些时间和精力,但它是有效的。

您有几个选择,没有一个是容易的,而且没有一个会给您留下“啪,被铃声救了”的感觉

解决这个问题的唯一真正方法是首先设法避免它

话虽如此,让我们在这里探讨一下选项:

  • 消除变更集
  • 引入更多“撤消”更改的更改集
  • 第一个选择是消除变更集,这很难。因为您将变更集推送到了中央存储库,所以您需要直接访问该服务器上的存储库

    如果这是一个服务器,您不能直接访问存储库,只能通过web界面或推/拉/克隆,那么您的选择是希望web界面有消除这些变更集的方法,否则请转到选项2

    为了消除变更集,您可以使用变更集对存储库进行新的克隆,并指定一些选项,以避免引入您想要消除的变更集,或者可以使用
    MQ
    扩展并去除有问题的变更集

    两者都不错,但我个人喜欢克隆选项

    但是,此选项取决于使用中央存储库的任何和所有开发人员:

  • 尚未从中央存储库中提取有问题的变更集
  • 或者准备在本地消除所述变更集
  • 例如,您可以指示所有开发人员终止其本地克隆,并在剥离中央存储库中的变更集后重新克隆一个新副本

    以下是重要的部分:

    如果您无法让所有开发人员提供帮助,您应该放弃这一思路,转而选择选项2

    为什么??因为现在你有两个问题:

  • 您需要引入障碍,以确保在您摆脱更改集之后,没有开发人员能够将相同的更改集再次推送到服务器上。请注意,依靠服务器发出的警告来防止推送新分支可能还不够好,因为开发人员可能有自己想要推送的分支,因此没有注意到他们也会推送您的分支
  • 任何开发人员基于任何有问题的变更集所做的任何工作都必须重新设置到新的位置,或者也要根除
  • 简而言之,这会给你带来很多额外的工作。我不会这样做,除非这些令人不快的变更集是超关键的,需要清除

    另一方面,选项2也有其自身的问题,但更容易执行

    基本上,您可以使用
    hg backout
    命令来引入一个新的变更集,该变更集将撤销违规变更集所做的修改,然后提交并推送该变更集

    这里的问题是,如果在某个时候你真的想引入这些变更集,你必须与Mercurial进行一些斗争,以便正确地进行合并

    但是,您的开发伙伴将不再需要更多的工作。下次他们拉动时,他们也会得到您的修正更改集

    让我用不同的话重申这个选项:

    保留更改集,而不是放弃更改集,而是引入另一个更改集以反转更改


    这两个选项都不好,都会产生一些额外的工作。

    也许你可以看看这个问题:唉,第二个选项并不总是可行的。我们首先尝试了它(参见我对这个问题的回答),但由于有问题的变更集是一个合并(应该属于分支a,但却属于分支B),因此我们在进一步合并a和B时遇到了各种各样的麻烦。最后,我们不得不剥离。