在 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")
**/
表示您要在存储库中递归搜索。
您也可以在文件名中使用*
通配符。您可以使用and
、or
运算符将此查询与其他修订集组合。
还有这个高级查询编辑器:
【讨论】:
【参考方案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 存储库历史记录中快速查找已删除的文件?的主要内容,如果未能解决你的问题,请参考以下文章