Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mercurial 查找与当前提示不共享历史记录的目录_Mercurial - Fatal编程技术网

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

Mercurial 查找与当前提示不共享历史记录的目录,mercurial,Mercurial,我有一份回购协议,我将把它一分为二(使用hg convert)。我想借此机会摆脱(排除)不必要的目录。但是,在某些情况下,我使用hgcp等移动文件,因此似乎未使用的目录可能有与它们关联的旧历史,在某些情况下,我已经验证了它们有关联。(在大多数情况下,这是非常古老的历史(大约从2004/2005年开始)。我现在很少这样做)。是否有办法检查某个特定目录是否与当前提示共享历史记录?我的意思是,对于目录foo: hg log -vf filename 对于所有文件名,提示中没有提到foo中的任何文件

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

hg log -vf filename
对于所有
文件名
,提示中没有提到
foo
中的任何文件

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

编辑:我后来才意识到上面的问题是错误的。在我的例子中,这些原始目录中的大多数仍然在tip中,所以我上面所说的不会起作用。相反,假设DIR_1,DIR_2,…,DIR_k是当前(在tip中)不再相关的目录。我想确保它们从来都不相关。换句话说,考虑不在DyRy1、Dyr2、…、Dryk中的任何文件。然后检查它们的祖先在这些目录中是否没有包含变更集。如果是,那么我想您需要将该目录从非相关目录列表中排除,然后重试

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

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

尝试使用目录目录目录,例如revset

hg log-r“祖先(提示)和文件('DIR/**.')”


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

我最终决定使用以下脚本

简介:基本思想是在tip中查找不属于文件历史记录的目录。因此,此脚本获取tip中的所有文件,并从所选目录集中删除这些文件。然后,它对每个文件执行
hglog-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
#/垃圾箱/垃圾箱
hg locate“set:not lisp/**和not boost/**和not trunk/**和not'c_api_ex/**”和not'c++-strategy/**和not parallel/**和not poster/**和not sim/**>file.txt
同时读取f;做
filelist=$(hg log-vf$f--模板“{files%'{file}\n'}”)
每行一个文件
对于$filelist中的文件
做
每行一个文件=“每行一个文件”${
完成
filematches=$(echo-e$one_file_per_line | sort-u | egrep'lisp/| boost/| trunk/| c|u api | ex/| c++-strategy/| parallel/| poster/| sim/)
如果[-n“${filematches}”];然后
echo文件$f在一个或多个lisp、boost、trunk、c_api_ex、c++-strategy、parallel、poster、sim目录中包含以下文件作为祖先:$filematches
fi
完成
谢谢你的回答。作为对DIR中某个文件的后续检查(本应作为问题的一部分询问此问题),是否可以跟踪tip中哪个文件是该文件的后代?因此,我们可以在tip中执行
hglog-vf file,并在DIR中查看该文件。事实上,我只是在一个目录上尝试了这个,我很确定这个目录没有与tip共享任何历史记录,我从上面的命令中获得了所有目录历史记录,这看起来是错误的。对不起,我刚刚意识到我对它的评论是胡说八道。问题是
DIR
仍在tip中,因此它当然会返回非零结果。我想问题应该是-DIR与DIR之外的任何东西共享历史吗?@FaheemMitha-试试这个:
hglog“set:DIR/**”--模板“{files%'{file}\n'}”|排序-u
并手工处理结果。如果失败:
hg locate“set:DIR/**”-0 | xargs hg log-f--template“{files%'{file}\n'}”
并通过管道将此输出传递到
dirname
(我在这里丢失了一个xargs)很抱歉打扰您,但我不明白您在这里拍摄的是什么。你能详细说明一下吗?具体来说,第一个命令应该返回什么,以及“手工处理结果”是什么意思?也许你可以把它写在你的答案里?此外,根据马特·麦考尔(谁应该知道)的说法,应该使用
DIR/**
而不是
DIR/**.
来匹配任何东西。引用他的话,“这将不匹配没有扩展名的文件。”@FaheemMitha-log with set必须(我认为)为DIR中的每个文件返回
hg log FILENAME
,并且只输出文件列表(EOL分隔)。。。我忘了这里的
-f
。使用-u进行排序将对这些文件名进行排序(在文件名前面加上路径),您只需检查文件的dir部分。第二个表单做同样的事情,但不是针对单个日志中的所有文件,而是针对“每个日志一个文件”。马特对图案的看法是对的,我错了