可以在公共回购中反映出由条带所做的更改吗?

时间:2011-08-09 17:17:37

标签: mercurial strip

假设我有这个:

hg clone public_repo my_repo
touch a b c d
hg add .
hg commit -m a a
hg commit -m b b
hg commit -m c c
hg commit -m d d
hg push
# let's say revX is the revision that added a 
hg strip revX

在我的存储库的历史记录中,提交已经消失。但是,如果我尝试在条带之后进行推送,它会告诉我no changes found。可以将条带应用于公共仓库吗?

编辑:问题只是假设:)。我不是在这种情况下,我只是觉得找出它如何工作会很有趣。

5 个答案:

答案 0 :(得分:10)

您需要在那里运行hg strip。如果它是bitbucket repo,您​​可以从管理面板执行此操作。如果没有,请使用SSH。

答案 1 :(得分:9)

这是不可能的。你也必须剥离公共回购。

hg strip只会带走变更集。它不执行可以推送的“添加”操作。

在您提供的确切示例中,您可以在公共存储库上hg rollback

答案 2 :(得分:7)

让我假装你问一个稍微不同的问题:我删除了部分存储库历史记录,如何将此更改传播到其他开发人员的存储库?

Mercurial无法以与传播添加更改集相同的方式传播剥离。所以你必须以自己的方式提出。

例如,Bitbucket有一个更新列表(在repo摘要页面上,如果我的记忆能很好的话)。如果你做一个条带,Bitbucket会显示如下:

  

Changeset 12345abcdef已从存储库中删除,请在本地运行hg strip 12345abcdef

当我们不得不在我们的商店宣传剥离部分旧分支时,我们就是这样做的:

  1. 删除了服务器上的更改集。
  2. 在repo的strip.bat分支上创建了一个名为default的批处理文件,其中包含我们在服务器上运行的命令,即hg strip 1234567890
  3. 告诉所有人无论何时无法推动,因为“推动创造新的远程头部”没有明显的原因,这意味着他们应该运行strip.bat
  4. 如果我们需要再次删除某些内容,我们只需在批处理文件中添加另一个hg strip

    P.S。是的,最好不要剥离,例如使用backout来提交逆变换集。有时,这不是一个选项:如果您希望将合并a合并到byou're trapped,则会错误地将分支b合并到分支a中。即使您在feature上撤销合并变更集,a中合并的变更集也已标记为已合并,您将很难再合并这些分支。

答案 3 :(得分:2)

正确而安全的方法是删除不必要的更改,使其成为hg backout

答案 4 :(得分:0)

有时无法对stripbackout进行更改,例如,如果它是合并修订版,并且您没有对服务器的管理员权限。一种有效的方法是分支最后一个好的修订版,然后关闭坏头。

  1. hg up badrev^(转到错误之前的修订版)
  2. touch dummy && hg add dummy && hg ci -m 'dummy' && hg rm dummy && hg ci --amend -m 'Fix accidental merge'(创建第二个头,没有修改好的修改)
  3. hg up badrev(转到错误的修订版)
  4. hg ci --close-branch -m 'Close bad head'(关闭坏头)
  5. hg push