我有一个我将要分成两部分的回购(使用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++/**.*')"
答案 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