是否有任何方法可以删除已被推送到所有开发人员共享的repo的分支?

时间:2011-07-31 17:07:56

标签: mercurial

我不小心把一个分支推到了一个回购。无论如何我可以改变回购(并删除分支)?关闭它不是一个解决方案。

3 个答案:

答案 0 :(得分:1)

当我们不得不从服务器仓库中移除一个分支时,我们遇到了类似的问题。退出不是一种选择,因为有问题的分支已被所有人拉动。

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

这种方法需要花费一些时间和精力才能让每个人摆脱分支,但它确实有效。

答案 1 :(得分:1)

你有几个选择,其中没有一个是容易的,并且没有一个会让你留下一个“p,,被钟声保存”的感觉。

解决此问题的唯一真正的方法是首先尝试避免它。

话虽如此,让我们在这里探讨各种选择:

  1. 根除变更集
  2. 介绍“撤消”更改的其他更改集
  3. 根除变更集的第一个选择很难。由于您将更改集推送到中央存储库,因此您需要直接访问该服务器上的存储库。

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

    为了摆脱变更集,您可以使用更改集创建存储库的新克隆,并指定仅停止引入您想要删除的变更集的选项,或者您可以使用MQ扩展名并删除有问题的变更集。

    要么是好的,但我个人喜欢克隆选项。

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

    1. 尚未从中央存储库中删除违规的变更集。
    2. 或准备在本地摆脱所述变更集。
    3. 例如,您可以指示所有开发人员杀死他们的本地克隆,并在您删除中央存储库中的更改集后重新放弃一个新副本。

      这是重要的部分:

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

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

      1. 您需要引入障碍,确保在您摆脱它们之后,开发人员不能再将相同的变更集推送到服务器上。请注意,依靠服务器的警告来防止推送新分支可能不够好,因为开发人员可能拥有自己的分支,他们想要推送,因此不会注意到他们将是推动你的。
      2. 任何开发人员基于完成的任何工作任何违规的变更集都必须重新定位到新的地方,或者根除。
      3. 简而言之,这将为您提供大量额外的工作。我不会这样做,除非违规的变更集是超级批判的摆脱。

        另一方面,选项2有自己的问题,但更容易实现。

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

        这里的问题是,如果在某些时候你真的想要引入这些变更集,你将不得不与Mercurial进行一些斗争才能使合并正确。

        但是,您的开发人员将不再有工作。下次他们拉,他们也会得到你的校正变更集。

        让我用不同的词重述这个选项:

        不要删除变更集,而是保留它们,但引入另一个可以反转变更的变更集

        两种选择都不好,两者都会产生一些额外的工作。

答案 2 :(得分:0)

如果上面Jason的评论中描述的'退出'选项不适合你,你可以使用hg convert重新制作回购,直至你的误推,这(尽管它的名字)也有效与hg。

例如hg convert -r before-mistaken-push /path/to/original /path/to/new

您可能必须使用usebranchnames和clonebranches设置。