查找不与当前提示共享历史记录的目录

时间:2013-07-18 19:42:57

标签: mercurial

我有一个我将要分成两部分的回购(使用hg convert)。我想借此机会摆脱(exclude)不必要的目录。但是,在某些情况下,我使用hg cp等来移动文件,因此看似未使用的目录可能具有与之关联的旧历史,并且在某些情况下我已经验证了它们。 (在大多数情况下,这是非常古老的历史(从2004/2005年左右开始)。我现在做的更少了)。有没有办法可以检查特定目录不与当前提示共享历史记录?我的意思是对于目录foo

hg log -vf filename
对于提示中的所有filename

未提及foo中的任何文件。

我认为这是一个充分的标准。

编辑:我姗姗来迟地意识到上述问题是错误的。在我的情况下,大多数这些原始目录仍然在小费,所以我上面说的将不起作用。相反,比如说DIR_1,DIR_2,......,DIR_k是当前(在提示中)不再相关的目录。我想确保它们永远不相关。换句话说,请考虑所有不属于DIR_1,DIR_2,...,DIR_k的文件。然后检查他们的祖先是否包含任何这些DIR中的变更集。如果是,那么我猜你需要从不相关目录列表中排除该目录,然后再试一次。

EDIT2:好的,让我们稍微分解一下。有人能告诉我触摸特定目录DIR中的文件的所有cset集的表达式是什么吗?以下内容似乎很接近,但我不确定如何解释表达式**.*

hg log -vr "file('c++/**.*')"

2 个答案:

答案 0 :(得分:1)

尝试目录DIR,例如revset

hg log -r "ancestors(tip) and file('DIR/**.*')"

任何输出都意味着"在历史中找到"

答案 1 :(得分:0)

我最终确定了以下脚本。

简要说明:基本思路是查找不属于文件历史记录的目录。因此,此脚本将获取提示中的所有文件,并从选定的目录集中删除这些文件。然后它为每个文件执行hg log -vf,并检查该日志中的任何文件是否与该组目录中的文件匹配。如果他们不这样做,那么可以安全地删除这些目录。

我确信这个脚本可以改进 - 我的shell脚本非常狡猾。建议改善赞赏。

#!/bin/sh

hg locate "set:not lisp/** and not boost/** and not trunk/** and not 'c_api_ex/**' and not 'c++-strategy/**' and not parallel/** and not poster/** and not sim/**" > file.txt

while read f; do
    filelist=$(hg log -vf $f --template "{files % ' {file}\n'}")
    one_file_per_line=""
    for file in $filelist
    do
    one_file_per_line="${one_file_per_line}""\n""${file}"
    done
    filematches=$(echo -e $one_file_per_line | sort -u | egrep 'lisp/|boost/|trunk/|c_api_ex/|c++-strategy/|parallel/|poster/|sim/')
    if [ -n "${filematches}" ]; then
        echo file $f has the following files as ancestors in one or more of lisp, boost, trunk, c_api_ex, c++-strategy, parallel, poster, sim directories: $filematches
    fi
done < file.txt