hg grep没有检查删除的文件

时间:2014-11-19 17:12:02

标签: mercurial

我一直在尝试关注this guide从我的存储库历史记录中删除大文件。问题是我无法使用hg grep命令工作:

hg grep -l ".*" "set:size('>10MB')"

具体来说,它无法打印当前工作目录中不存在的任何文件。如果在过去的任何时候我hg rm指定了一个文件,则该命令不会列出该文件。如果我在删除给定文件之前更新到变更集,则 正确列出该文件。我一直在研究hg grep的文档,但我无法理解为什么它会忽略在某些时候从存储库中删除的文件。检查不在工作目录中的文件似乎是hg grep的全部目的。

是否有任何方法可以让hg grep检测已删除的文件,或者通常是为了获取已提交到存储库的给定文件大小的所有文件的列表,即使它们已经被删除去掉?

3 个答案:

答案 0 :(得分:1)

虽然iondune的解决方案可行,但在合理大量的回购上可能需要很长时间。更快的解决方案是直接查看hg的元数据。从项目工作目录:

$ find ./.hg/store/data -type f -exec du -ah {} + | sort -hr | head -n 20

这将给出具有最大差异的20个文件的列表。存储库中实际文件与Mercurial元数据存储方式之间的映射是pretty straightforward

答案 1 :(得分:0)

我最终放弃尝试使用hg命令执行此操作并只使用此bash脚本:

#! /bin/bash

EndRevision=568  # Latest Revision
Repository="/path/to/repository"

mkdir -p "Results"

for i in $(seq 0 "$EndRevision") ; do
    echo " --- Doing revision $i of $EndRevision ---"
    hg up -C -R "$Repository" -r "$i"
    find $Repository/* -type f -exec du -ah {} + > "Results/From${i}"
done

以及以下单行:

cat Results/From* | sort -hr | uniq | head -n 25

它足以满足我的需求(确定存储库历史记录中的大型文件的完整列表)。

答案 2 :(得分:0)

hg locate -r "set...可能更容易。像

这样的东西

hg locate "set:size('>10MB')" -r ":"