在发出以下命令时,在动态“默认视图”的上下文中:
$ cd Dir_A/Dir_B
$ ct find . -all -nvi -type f -ele 'brtype(my_branch)' -print
对于每一行,我得到奇怪的输出,如下所示:
/vobs/vob_name/Dir_A/Dir_B@@/main/Branch_A/Branch_B/n1/Dir_C/main/Branch_C/n2/Dir_D/main/Branch_D/n3/Filename@@
如何让find命令只打印标准操作系统路径名而不包含每个目录的所有中间版本信息?
我试过-exec 'ct des -fmt'
无济于事。
答案 0 :(得分:2)
这种奇怪的格式称为 extended path name 作为explained here,结果如下:
\proj_vob\foo.c@@\main\bugfix\4
实际上称为版本扩展路径名。
在你的情况下:
/vobs/vob_name/Dir_A/Dir_B@@/main/Branch_A/Dir_C/[...]/n3/Filename@@
是 vob扩展路径名。
它引用了视图中不再可见的元素(文件或目录)(因为它们已经被rmnamed,被删除)。
您可以使用其版本ID访问任何版本的元素,该版本ID指定其确切的版本树位置。
这允许访问在视图中不可见的版本(即由视图的配置规范选择),在该版本中您执行cleartool find
(从a view is a requirement for a find开始)。
还可以尝试-nxname
选项:
ct find . -all -nvi -nxname -type f -ele "brtype(my_branch)" -print
(但这只会删除最终的@@
)
fmt_ccase有一些方法可以对其进行格式化,但您也可以尝试(in here):
-exec "echo %CLEARCASE_PN%"
(此处不起作用,因为找到的版本没有“路径名称”:视图不会直接选择它,因此该版本不可见,并且%CLEARCASE_PN%
已设置到%CLEARCASE_XPN%
,扩展路径名。)
还检查Leaf名称返回的内容:
-exec "cleartool descr -fmt \"%Ln\" \"%CLEARCASE_XPN%\""
但是这只返回文件名,而不是它的路径。
如果您需要一个简单的路径(不代表“实际”路径,因为这些元素在视图中并非全部可见),您需要处理每一行以删除/main/.../n1
,只留下Dir_C\dir_D\element
。
这是一个假设这样做的库:ClearCase-Tools
$explicitPath = '/vobTag/users/.@@/main/1/llf/main/12/install/main/1/README/main/2';
$canonPath = ClearCase::Vob::CanonPath->parse( $explicitPath );
$canonPath = $cpathObj->parse( $explicitPath );
在此示例中,
$canonPath
将包含以下字符串:
/vobTag/users/llf/install/README
您可以在usr/lib/perl5/vendor_perl/5.6.1/ClearCase/Vob/CanonPath.pm
中找到sources in those rpm。
实施并非易事,但它是可行的:非常小的提取:
push @branches, "main";
while (@leaves && !(($leaves[0] =~ "^[0-9]+\$") || ($leaves[0] =~ "^CHECKEDOUT\.[0-9]+\$"))) {
$leaf = shift(@leaves);
push @branches, $leaf if defined($leaf);
$self->dpr("dump(3) $leaf") if defined($leaf);
}