在 Mercurial 存储库历史记录中快速查找已删除的文件?

Posted

技术标签:

【中文标题】在 Mercurial 存储库历史记录中快速查找已删除的文件?【英文标题】:Find deleted files in Mercurial repository history, quickly? 【发布时间】:2010-11-04 01:18:33 【问题描述】:

您可以使用hg grep,但它会搜索所有文件的内容。

如果我只想搜索已删除文件的文件名来恢复呢?

我尝试了hg grep -I <file-name-pattern> <pattern>,但这似乎没有返回任何结果。

【问题讨论】:

【参考方案1】:

使用templates is simple:

$ hg log --template "rev: file_dels\n"

【讨论】:

一个小的调整来摆脱没有删除发生的提交:hg log --template "rev: file_dels\n" | grep -v ':\s*$' 有人能解释一下如何使用 grep 来查找您关心的文件的名称,对于我们这些新手来说?谢谢! 这个命令真的很简单。它使用提供的模板写入整个存储库日志。在这种情况下,它会为每个修订写入修订号和已删除的文件 - 您可以使用 grep 查找所需的文件。获得修订后,您可以使用hg revert -r 123 path/to/the/file.txt 来恢复它。请注意,您需要在删除文件之前指定一个修订版! (只需减去 1) 这个解决方案真的很慢,如果你是一个经常变化的人,你应该在另一个答案中使用 revset 解决方案。 @LarsNoschinski:我发现相反的情况。我发现,当应用于具有超过 150,000 个变更集的存储库时,revset 解决方案的运行时间要长得多。见我的 cmets ***.com/questions/1013550/… 和 ***.com/questions/1013550/…。【参考方案2】:

Mercurial 1.6 更新

你也可以使用revsets:

hg log -r "removes('**')"

编辑:注意双重* - a single one detects removals from the root of the repository only。)


编辑:正如 Mathieu Longtin 所建议的,这可以与 dfa's answer 中的 template 结合使用,以向您显示每个列出的修订删除了哪些文件

hg log -r "removes('**')" --template "rev: file_dels\n"

这具有每行列出一个修订的优点(对于机器可读性),但是您可以通过使用% 格式化删除列表中的每个项目来使输出更漂亮:

hg log -r "removes('**')" --template "rev:\nfile_dels % 'file\n'\n"

【讨论】:

我会将这两者结合起来:hg log --template "rev: file_dels\n" -r "removes('*')"。否则,您的默认 hg 日志模板可能不会显示删除了哪些文件。 拥有超过 150,000 个变更集的存储库并使用 Mercurial 2.5.4,我发现 hg log -r "removes('**')" 查找和显示最近删除的文件的时间明显长于 hg log --template "rev: file_dels\n"hg log -r "removes('**')" 是否会在生成输出之前搜索整个存储库历史记录? “显着更长”是指我在 hg log -r "removes('**')" 运行超过 12 分钟后取消了它,并且没有输出任何结果。另一方面,hg log --template "rev: file_dels\n" 在不到一分钟的时间内输出其第一页结果。 @Derek 这是个好问题,但我不知道答案。可能是邮件列表中的一个? 似乎一个按时间顺序运行,另一个按时间倒序运行,这样可以解释观察到的差异吗?【参考方案3】:

从项目根目录

hg status . | grep "\!" >> /tmp/filesmissinginrepo.txt

【讨论】:

似乎没有回答这个问题。我正在暗示询问者对存储库历史的引用。您的命令报告尚未从存储库中删除但从工作副本中丢失的文件。【参考方案4】:

有效地搜索您删除的特定文件,并将结果格式化:

hg log --template "File(s) deleted in rev rev: file_dels % '\n  file'\n\n" -r 'removes("**/FileYouWantToFind.txt")'

样本输出:

File(s) deleted in rev 33336: 
  class/WebEngineX/Database/RawSql.php

File(s) deleted in rev 34468: 
  class/PdoPlus/AccessDeniedException.php
  class/PdoPlus/BulkInsert.php
  class/PdoPlus/BulkInsertInfo.php
  class/PdoPlus/CannotAddForeignKeyException.php
  class/PdoPlus/DuplicateEntryException.php
  class/PdoPlus/Escaper.php
  class/PdoPlus/MsPdo.php
  class/PdoPlus/MyPdo.php
  class/PdoPlus/MyPdoException.php
  class/PdoPlus/NoSuchTableException.php
  class/PdoPlus/PdoPlus.php
  class/PdoPlus/PdoPlusException.php
  class/PdoPlus/PdoPlusStatement.php
  class/PdoPlus/RawSql.php

【讨论】:

【参考方案5】:

如果您使用的是 TortoiseHg 工作台,一个方便的方法是使用修订过滤器。只需点击ctrl+s,然后输入

removes("**/FileYouWantToFind.txt")

**/ 表示您要在存储库中递归搜索。 您也可以在文件名中使用* 通配符。您可以使用andor 运算符将此查询与其他修订集组合。

还有这个高级查询编辑器:

【讨论】:

【参考方案6】:

我已经采取了其他答案并对其进行了改进。

添加了“--no-merges”。在有开发团队的大型项目中,会有很多合并。 --no-merger 将过滤掉日志噪音。

removes("**") 更改为sort(removes("**"), -rev)。对于具有超过 100K 变更集的大型项目,这将更快地获取删除的最新文件。这将顺序从 rev 0 开始反转为从 tip 开始。

在输出中添加了 author 和 desc。这将通过显示日志注释和执行者来说明文件被删除的原因。

所以对于我的用例,它是hg log --template "File(s) deleted in rev rev: author \n desc\n file_dels % '\n file'\n\n" -r 'sort(removes("**"), -rev)' --no-merges

样本输出:

File(s) deleted in rev 52363: Ansariel 
 STORM-2141: Fix various inventory floater related issues:
* Opening new inventory via Control-Shift-I shortcut uses legacy and potentinally dangerous code path
* Closing new inventory windows don't release memory
* During shutdown legacy and inoperable code for inventory window cleanup is called
* Remove old and unused inventory legacy code

  indra/newview/llfloaterinventory.cpp
  indra/newview/llfloaterinventory.h

File(s) deleted in rev 51951: Ansariel 
 Remove readme.md file - again...

  README.md

File(s) deleted in rev 51856: Brad Payne (Vir Linden) <vir@lindenlab.com> 
 SL-276 WIP - removed avatar_skeleton_spine_joints.xml

  indra/newview/character/avatar_skeleton_spine_joints.xml

File(s) deleted in rev 51821: Brad Payne (Vir Linden) <vir@lindenlab.com> 
 SL-276 WIP - removed avatar_XXX_orig.xml files.

  indra/newview/character/avatar_lad_orig.xml
  indra/newview/character/avatar_skeleton_orig.xml

【讨论】:

以上是关于在 Mercurial 存储库历史记录中快速查找已删除的文件?的主要内容,如果未能解决你的问题,请参考以下文章

清理 Mercurial 存储库

您使用什么命令从Mercurial存储库中排除文件?

在 Mercurial 中拆分文件并保留双方的历史记录

如何检查TFS服务器上是否有新的更改?

Mercurial:删除单个非头部变更集

提交后修复Mercurial存储库中的重命名