假设我有这个:
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
。可以将条带应用于公共仓库吗?
答案 0 :(得分:10)
您需要在那里运行hg strip
。如果它是bitbucket repo,您可以从管理面板执行此操作。如果没有,请使用SSH。
答案 1 :(得分:9)
这是不可能的。你也必须剥离公共回购。
hg strip
只会带走变更集。它不执行可以推送的“添加”操作。
在您提供的确切示例中,您可以在公共存储库上hg rollback
。
答案 2 :(得分:7)
让我假装你问一个稍微不同的问题:我删除了部分存储库历史记录,如何将此更改传播到其他开发人员的存储库?
Mercurial无法以与传播添加更改集相同的方式传播剥离。所以你必须以自己的方式提出。
例如,Bitbucket有一个更新列表(在repo摘要页面上,如果我的记忆能很好的话)。如果你做一个条带,Bitbucket会显示如下:Changeset 12345abcdef已从存储库中删除,请在本地运行
hg strip 12345abcdef
。
当我们不得不在我们的商店宣传剥离部分旧分支时,我们就是这样做的:
strip.bat
分支上创建了一个名为default
的批处理文件,其中包含我们在服务器上运行的命令,即hg strip 1234567890
。strip.bat
。如果我们需要再次删除某些内容,我们只需在批处理文件中添加另一个hg strip
。
P.S。是的,最好不要剥离,例如使用backout来提交逆变换集。有时,这不是一个选项:如果您希望将合并a
合并到b
,you're trapped,则会错误地将分支b
合并到分支a
中。即使您在feature
上撤销合并变更集,a
中合并的变更集也已标记为已合并,您将很难再合并这些分支。
答案 3 :(得分:2)
正确而安全的方法是删除不必要的更改,使其成为hg backout
。
答案 4 :(得分:0)
有时无法对strip
或backout
进行更改,例如,如果它是合并修订版,并且您没有对服务器的管理员权限。一种有效的方法是分支最后一个好的修订版,然后关闭坏头。
hg up badrev^
(转到错误之前的修订版)touch dummy && hg add dummy && hg ci -m 'dummy' && hg rm dummy && hg ci --amend -m 'Fix accidental merge'
(创建第二个头,没有修改好的修改)hg up badrev
(转到错误的修订版)hg ci --close-branch -m 'Close bad head'
(关闭坏头)hg push