0

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

hg log -vf filename

for all filenamein tip 没有提到foo.

我认为这是一个足够的标准。

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

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

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

2 回答 2

1

尝试目录 DIR 这样的 revset

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

任何输出都意味着“在历史中发现”

于 2013-07-18T20:23:48.860 回答
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
于 2013-07-24T09:59:46.343 回答