删除所有本地变更集并还原为树。

95

我正在使用Mercurial,本地出现了三个分支,导致当前状态非常混乱。我无法推送提交,并且只想删除所有本地更改和提交记录,然后使用完全干净的代码和清晰的历史记录重新开始。

换句话说,我希望最终(a)本地完全与远程分支的tip存在相同的代码,并且(b)没有任何本地提交的历史记录。

我知道hg update -C会覆盖任何本地更改。但是如何删除任何本地提交?

明确一下,我不想保留我在本地完成的任何工作。我只想找到最简单的方式将其还原为完全干净的本地检查。


可能是Mercurial中是否有删除本地提交的方法?的重复问题。 - StayOnTarget
7个回答

132

当最简单的方式(新的hg clone)不切实际时,我使用hg strip


% hg outgoing -l 1
% hg strip $rev # replace $rev with the revision number from outgoing

重复执行直到hg outgoing保持静默。请注意,hg strip $rev会消除$rev及其所有后代。

请注意,在您的Mercurial设置中可能需要先启用strip

注:更加智能的方法是使用revset语言进行操作:

% hg strip 'roots(outgoing())'

1
谢谢!我最终遇到了这个完美解决的情况,没有任何麻烦。 - eswald
1
这个简单的方法让我避免了之前需要进行的大量修复工作,非常感谢! - David C
4
如果有人因为hg strip 'roots(outgoing())'不被识别而无法正常使用该命令,可以尝试使用hg strip "roots(outgoing())"。这样可以让命令正常运行。 - jsea
cmd.exe 中,是的,@SombreErmine。 - just somebody

21
您需要创建一个本地克隆,只保留与远程存储库中存在的变更集相同的变更集。使用TortoiseHghg log或类似工具找出您未进行的最新修订(混乱开始之前的修订)。在这里使用hg outgoing可以帮助您列出所有您所做的变更集,选择早于其中任何一个的修订号。
如果目标修订版本称为good,而您的克隆称为foo,则执行以下操作:
hg clone -r good foo foo-clean

这将是一个快速的本地操作——没有理由再次下载所有内容。foo-clean克隆只包含到修订版本good的变更集。您现在可以用foo/.hg/hgrc替换foo-clean/.hg/hgrc,以保留存储库本地设置,如默认推/拉路径。
当您确定foo-clean已经拥有您从foo需要的所有内容时,只需删除foo并将foo-clean重命名为foo。执行hg pull以将来自远程存储库的任何新变更集获取到您的克隆中,并像往常一样继续进行。
如果没有人将新的变更集推送到远程存储库,则确定您想要用作“good”的修订版本非常简单:使用hg id default将告诉您远程存储库中最新版本的ID。

我遇到了相同的情况,但是仓库目录中有很多文件被忽略了。无法安装hg strip,并且想要删除本地提交而不替换整个克隆。有什么好的想法吗?--啊!如果我没有添加任何文件,那么我应该可以将另一个克隆复制到我的旧目录中! - Peteter
如果您有多个分支,请小心使用此方法。仅克隆到指定的修订版只会获取指定修订版所在分支上的变更集。然后,您可能需要对每个额外分支执行 hg pull -r 以获取最后一个“好”的修订版。 - Yitz

9

好的。所以只需删除所有本地内容,hg init 新的本地存储库并 hg pull 最新的代码。记得在此之后执行 hg update


谢谢。当你说“删除所有本地内容”时,是指删除整个仓库还是只是我的更改?hg init是什么(已经谷歌搜索过了,但没有找到简单的解释),我需要使用任何标志吗?它会删除像我的Mercurial .hgrc首选项这样的东西吗? - Richard
更新:如果我删除项目根目录中的所有内容,然后输入'hg init',我会得到'abort: repository . already exists!'。我需要设置并从新目录工作吗?如果可能的话,我宁愿不这样做...肯定有一种简单的方法可以清除我在本地所做的一切! - Richard
是的,请删除所有内容,包括所有存储库文件。从一个新的干净文件夹开始。您可以将偏好保存在备份文件中,然后将它们恢复到您使用 hg init reponame 创建的新存储库中。有关 init 和其他详细信息,请参阅: http://hgbook.red-bean.com/read/mercurial-in-daily-use.html - alemjerus
6
hg init + hg pull = hg clone,区别在于hg clone会为您生成一个漂亮的.hg/hgrc文件,并且在同一文件系统上克隆时,hg clone将使用硬链接来节省空间。 - Martin Geisler
Richard: hg help init 的输出在这里:http://www.selenic.com/mercurial/hg.1.html#init 但也许这太简略了?如果你需要更多帮助,请发送电子邮件到我们的邮件列表!请参见:http://mercurial.selenic.com/wiki/MailingLists - Martin Geisler
这是一种完全有效的方法,但对于较大的代码库来说,不是最快的方式。 - StayOnTarget

5

你可以在公共版本上使用它,但如果你再次拉取,它就会重新出现。(hg strip 仅适用于本地存储库。) - Mike Rosoft

2

只需删除本地系统上的所有内容,然后重新克隆远程存储库。


2
hg strip `hg out --template "{rev} {author}\n" | grep YOUR_AUTHOR_NAME | cut -d " " -f 1`
这段代码可以帮助你删除所有未推送到默认存储库中的与你的作者名相同的修订版本。 如果你想检查另一个存储库而不是默认存储库,也可以使用这种方法:
hg strip `hg out OTHER_REPO_ALIAS --template "{rev} {author}\n" | grep YOUR_AUTHOR_NAME | cut -d " " -f 1`

0

如果你正在使用TortoiseHg,解决(小)问题的一种简单方法是首先更新到最新版本,然后选择您的变更集并启动“与本地合并”。当合并对话框出现时,只需单击小“+”图标以显示一些额外选项之一即可,“删除合并目标(其他)版本的变更集”。这样做意味着您的更改集仍将在存储库中并被推送,但不会产生影响,因为它们将在合并中被丢弃。如果您有许多跨越许多头部的更改集,则可能不希望以此方式污染存储库,但这是一个简单的修复方法,如果您正在丢弃的更改集包含稍后可能要引用的数据,则值得考虑。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接