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


95

我正在使用Mercurial,在本地遇到了三个头的可怕混乱。我无法推送,我只想删除所有本地更改和提交,然后从完全干净的代码和干净的历史记录重新开始。

换句话说,我想得出的结果是(a)与远程分支的尖端完全相同的本地代码,以及(b)没有任何本地提交的历史记录。

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

需要明确的是,我对保留在本地所做的任何工作都没有兴趣。我只想以最简单的方法还原到完全干净的本地结帐。


Answers:


129

当最简单的方法(new 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了它及其所有后代。

请注意,您可能必须strip在Mercurial设置中启用

PS:一种更聪明的方法是使用revset语言,然后执行以下操作:

% hg strip 'roots(outgoing())'

1
谢谢!我最终遇到了一个完美解决的情况,没有大惊小怪。
eswald 2011年

1
这使我摆脱了上面的大补丁,非常简单,谢谢!
David C

3
如果有人hg strip 'roots(outgoing())'因无法识别而无法上班'roots(outgoing())'。我能够与它合作hg strip "roots(outgoing())"
jsea 2015年

@中的@SombreErmine cmd.exe
某人

21

您需要创建一个本地克隆,其中仅保留远程存储库中也存在的变更集。使用TortoiseHghg log或类似找出哪些你的修订是你最新的版本并没有使(开始混乱前一个)。hg outgoing在这里使用可以有所帮助-它将列出您所做的所有变更集-请先选择任何修订号。

如果调用了目标修订版,good而您的克隆称为foo,则执行以下操作:

hg clone -r good foo foo-clean

这将是一种快速的本地操作- 没有理由再次下载所有内容。该foo-clean克隆将只包含多达版本的变更good。现在foo-clean/.hg/hgrc,您可以替换foo/.hg/hgrc为以保留您的存储库本地设置,例如默认的推/拉路径。

当您满意foo-cleanfoo,便可以删除foo并重命名foo-cleanfoo。进行操作hg pull以将任何新更改集从远程存储库获取到您的克隆中,然后像往常一样继续。


如果没有人将新的变更集推送到远程存储库,那么按照good上面的方法确定要使用的修订版本非常简单:hg id default会告诉您远程存储库中提示的ID。


我遇到同样的情况,但是在repo目录中也有很多文件,但是在hgignore中。无法安装hg strip,并且想删除本地提交而不替换整个克隆。有任何想法吗?-啊!如果我没有添加任何文件,则应该能够将另一个克隆复制到我的旧目录中!
彼得

但是,如果您有多个分支,请谨慎使用此方法。克隆到指定的修订版只会在指定修订版的分支上获取变更集。然后,您可能必须hg pull -r为每个其他分支的最新“良好”修订版。
Yitz 2013年

9

好。因此,只需删除所有本地内容,hg init新的本地存储库和hg pull您拥有的最新提示。hg update在此之后不要忘记。


谢谢。当您说“删除所有本地内容”时,是指删除整个存储库,还是仅删除我的更改?hg init有什么作用(已经过Google搜索,但看不到简单的解释),我需要对其使用任何标志吗?它将删除诸如Mercurial .hgrc首选项之类的内容吗?
理查德

更新:如果我删除项目根目录中的所有内容,然后键入“ hg init”,则会得到“ abort:repository”。已经存在!'。我是否需要在新目录中进行设置和工作?我宁愿不要,如果可能的话……肯定有一种简单的方法可以杀死我在本地所做的一切吗?
理查德

是的,删除所有内容,包括所有存储库内容。从一个新的干净文件夹开始。您的首选项可以保存在备份文件中,然后将其还原到使用hg init reponame创建的新存储库中。有关初始化和内容的详细信息:hgbook.red-bean.com/read/mercurial-in-daily-use.html
alemjerus

6
alemjerus:hg init+ hg pull= hg clone不同之处在于,hg clone.hg/hgrc为您创建了一个不错的文件,并且hg clone在同一文件系统上进行克隆时将使用硬链接来节省空间。
Martin Geisler 2010年

理查德(Richard):输出hg help init是在这里:selenic.com/mercurial/hg.1.html#init但这也许太简洁了吗?如果您需要更多帮助,请发送邮件到我们的邮件列表!参见:mercurial.selenic.com/wiki/MailingLists
Martin Geisler 2010年


2

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


2
hg strip`hg out --template“ {rev} {author} \ n” | grep YOUR_AUTHOR_NAME | 切-d“” -f 1`

为我做the俩。

它会删除所有没有推送到使用您的作者姓名创建的默认存储库的修订。

您还可以使用此样式使它不与默认存储库一起检查,而与另一个存储库一起检查

hg strip`hg out OTHER_REPO_ALIAS --template“ {rev} {author} \ n” | grep YOUR_AUTHOR_NAME | 切-d“” -f 1`

0

如果您使用的是TortoiseHg,摆脱(小)混乱的一种简单方法是先更新到最新版本,然后选择变更集并启动“与本地合并”。出现合并对话框时,只需单击小“ +”图标以显示一些其他选项,其中之一就是“放弃来自合并目标(其他)修订版的变更集”。这样做将意味着您的变更集仍将保留在存储库中并被推送,但没有任何效果,因为它们将在合并中被丢弃。如果您有很多变更集跨越多个头,那么您可能不希望以此方式污染存储库,但这是一个简单的修复方法,值得考虑的是,您要丢弃的变更集是否包含您以后可能要引用的数据。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.