如何在Mercurial中恢复已删除的文件(如果有的话)?


100

偶然地,通过使用GUI而不是CLI,我删除了Mercurial项目中的每个文件。

我通过“还原正常”恢复了工作,失去了一些工作,因为有了时间机器,我可以轻松地找回工作。但是,是否有一种方法可以取消/取消删除此类文件?遍历手册和谷歌搜索,但看不到任何东西。有插件吗?

我可能在这里回答我自己的问题,但是文件已从目录中删除,并且不在回收站中,因此我假设Remove是不可撤消的吗?

ps我知道hg forgethg remove -Af将删除而不删除目录,但我的问题与我犯的错误有关,而不是冷静地思考操作。


1
您应该能够签出较旧的修订版本,并且很好(当然,这仅在您不重写历史记录的情况下才有效)
tback

问题是我已提交并进行了编辑,R(已删除)。因此,按照上述顺序,是的,我已经获得了先前的提交,因此回到了这一点,并且由于我以时间机器的形式进行了备份,因此我可以从中获得最后的更改,然后将其添加并提交。但是,如果我没有备份,那么更改将丢失。
PurplePilot 2010年

1
相关问题可让您搜索只是文件名(快):stackoverflow.com/questions/1013550/...
迈克尔·普赖尔

Answers:


152

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


5
谢谢,为我工作得很好。在寻找“如何恢复我故意删除的文件?”的答案?
nc。

从eclipse中可以通过右键单击文件Select Team-> Revert
Emil

3
查找包含该文件的修订的另一种方法是hg log -I '**file.ext'
mpen

2
仅供参考:您想要的是仍具有文件的提交的修订版本号,而不是已删除文件的提交版本号!
卢卡斯·努斯

8

引用评论:

我建立了一个存储库,全部提交,删除,然后再次提交

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

$ hg update -C -r-2

注意版本号为负。如果删除的文件不在先前的版本中,则可以使用以下命令找到它们:

$ hg log -v

5

好吧,这对我有用。

hg revert -r revision pathToTheFile

4

适用于Mercurial 1.6以上

如果知道删除文件的名称,则可以使用以下命令轻松找到其修订版本:

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

这将为您提供巫婆中的修订版本,名为NAME.c的文件(在根目录中)将被删除。

然后,您可以使用以下命令将文件还原到以前的版本:

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

您可以改用文件名模式来适应您所知道的内容,例如,可以用于**/NAME.c搜索所有目录。您可以在“ 文件名模式”中阅读有关它的信息。并使用此链接了解新的revset规范


1

可接受答案的补充-如果您要撤消一次提交中的所有删除操作,这会更快。我删除了一个装有数百个文件的大文件夹,然后执行了hg addremove,但这并不是我的全部意图,因此必须撤消所有这些删除操作。

使用Mercurial存储库历史记录中的“查找已删除的文件”很快吗?+ 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的时刻。


0

您可以使用撤消对存储库的最后一次提交hg rollback。只有一种级别的回滚可用,因此,如果您执行了一次以上的提交删除操作,则不会完全撤消您的更改。这仅适用于您的本地存储库,因此如果您已推送,将无法在远程存储库中撤消它。


1
不,这不起作用。我正在使用带有Mercurial Distributed SCM(版本1.4.1 + 20091201)的Mac。我建立了一个存储库,先提交所有内容,然后再删除,然后再次提交,但这只会带回标记为R(删除)的文件列表,而实际上没有带回文件。如果我在提交之前将文件标记为R(删除)和回滚,则不会发生任何事情。
PurplePilot '02

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

1
hg rollback不会恢复已删除的文件,因为删除文件不是提交事务的一部分。
mrucci

4
那就对了。如果您希望获得在删除之前未提交的编辑,则它们会丢失。
ataylor'2

0

您可以使用删除已提交的修订 hg strip mq(Mercurial Queues)扩展名提供命令。这应该可以将您的文件退还给您。

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


0

下面的方法很简单而且很愚蠢,不会出错。如果您删除或重命名了多个文件,则可以。

hg clone mydirectory mydirectory1

现在,您启动mc(或Far Manager),并比较它是什么与已经变成了什么。

完成后,只需删除即可mydirectory1


0

以下为我工作。

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

(可选,还原所有文件)

hg revert -r <Revision Number> --all
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.