2010-02-01 94 views
91

意外的是,通过使用GUI而不是CLI,我删除了Mercurial项目中的每个文件。如何恢复Mercurial中的已删除文件(如果有的话)?

我恢复恢复好,失去了一些工作,这是我有时间机器,我可以很容易地回来。但是有没有解除/删除这些文件的方法?通过手册和google搜索,但看不到任何东西。任何插件?

我可能回答我的问题在这里,但该文件从目录中消失,不是在垃圾回收,所以我假设删除是不可撤销的?

p.s.我知道hg forgethg remove -Af将从目录中删除而不删除,但我的问题与我所做的错误有关,而不是通过冷静思考该操作。

+1

你应该能够检出的旧版本和罚款(当然在此情况下,只有你的作品没有改写历史) – tback 2010-02-01 09:03:52

+0

的问题是我犯了,做了编辑,R(emoved)。所以在那个序列之后,是的,我已经得到了上一次提交,所以回到那个时候,因为我已经以时间机器的形式备份了,我可以从最后的变更中添加它们然后提交。但是,如果我没有备份,更改将会丢失。 – PurplePilot 2010-02-02 09:39:05

+1

相关问题,它可以让你只搜索文件名(快速):http://stackoverflow.com/questions/1013550/find-deleted-files-in-mercurial-repository-history-quickly – 2012-01-19 22:18:17

回答

141

首先,使用hg grep找到您要恢复被删除的文件。此命令的输出将显示文件所在的最新修订版本以及删除文件的路径。 二,运行hg revert -r <revision number> <path to deleted file> 删除的文件现在将在您的工作副本中,准备好提交回头。

+5

对我很好,谢谢。正在寻找“如何恢复我故意删除的文件?”的答案。 – 2011-07-04 11:59:09

+1

正是我需要的 - 谢谢。 – sa125 2012-11-22 18:12:58

+1

非常感谢,你从eclipse中保存了我的日子 – Emil 2013-03-12 06:46:22

0

您可以使用hg rollback撤消上一次回购提交。只有一个级别的回滚可用,所以如果您使用多个提交进行了删除,则这不会完全撤消您的更改。这只适用于您的本地存储库,所以如果您推送了您,将无法在远程仓库中将其撤销。从评论

+1

没有这个不行。我正在使用带有Mercurial分布式SCM的Mac(版本1.4.1 + 20091201)。我建立了一个仓库,全部提交,移除并重新提交,但是这只会返回标记为R(emoved)的文件列表,但实际上并没有将文件带回。如果我在提交之前将文件标记为R(emoved)和Rollback,则任何事情都不会发生。 – PurplePilot 2010-02-02 08:38:19

+0

完成hg回滚之后,您的回购将被回滚,但您当前的工作目录仍将进行更改。只要告诉hg对滚回的修订版进行干净的更新,现在就提示:hg up -C。 – ataylor 2010-02-02 19:01:27

+1

'hg rollback'不会恢复已删除的文件,因为删除文件不是提交事务的一部分。 – mrucci 2010-02-03 11:23:10

7

报价:

我建立了一个仓库,承诺全部移除,然后再次提交

如果是这种情况,那么你只需要更新的工作目录以前的版本:

$ hg update -C -r-2 

注负版本号。如果你删除的文件是不是在以前的版本中,您可以通过找到他们:

$ hg log -v 
0

可以使用hg strip命令,其由MQ(水银队列)扩展提供除去提交修订版本。这应该会让你回到你的文件。

在尝试之前进行备份,因为它会改变Mercurial的变更集数据库。

0

下面的方法很简单,很愚蠢,不会出错。 如果你已经删除或重命名了多个文件,它会没事的。

hg clone mydirectory mydirectory1 

现在你启动MC(或远程管理器),并比较它是什么与它变成了什么。

完成后,只需删除mydirectory1即可。

1

除了接受的答案之外 - 如果您想撤消提交中的所有删除,则速度更快。我删除了一个包含几百个文件的大文件夹,并做了hg addremove,这完全不是我的意图,因此必须撤消所有这些删除。

使用Find deleted files in Mercurial repository history, quickly? + xargs的+ TR,恢复所有修订-3清除的版本从版本-4:

hg log -r -3 --template "{rev}: {file_dels}\n" | tr ' ' '\n' | xargs hg revert -r -4 

请注意,如果你的任何文件的文件名中的空间,这将失败; http://hgbook.red-bean.com/read/customizing-the-output-of-mercurial.html似乎没有任何模板,其中{file_dels}此刻被\n拆分。

4

对于水银1.6及以上

如果知道删除文件的名称,你可以找到它的修改很容易地:

hg log -r "removes('NAME.c')" 

这将使你在女巫的版本称为文件NAME.c(在根目录中)被删除。

然后你就可以用(像其他答案)文件还原到以前的版本:

hg revert -r <revision number> <path to deleted file> 

您可以使用一个文件名模式,而不是去适应你所知道的,例如,你可以使用**/NAME.c来搜索所有目录。你可以在File Name Patters阅读。并使用此链接了解新的revset specifications

0

以下为我工作。

hg revert -r <Revision Number> <File Name> 

(可选,恢复所有文件)

hg revert -r <Revision Number> --all