6

我想在 ClearCase 中找到标有特定标签但没有任何其他标签集的文件。

例如,如果我有这样标记的文件:

file1 LBL_A, LBL_B
file2 LBL_A

我想要一个只给我file2而不是file1的查询。

有没有办法用 cleartool find 做到这一点?如果这不可能通过单个查询来完成,我也会很高兴知道如何通过几个步骤来执行此操作(我将从 perl 脚本调用 cleartool,因此保存文件列表会很容易暂时并在它们上运行进一步的命令)。

提前非常感谢!

4

3 回答 3

7

假设 LBL_A 是您要运行的(唯一)标签

cleartool find /some/dir -version 'lbtype(LBL_A)' -print | xargs cleartool describe -fmt "%n: %l"

应该给

file1: (LBL_A, LBL_B)
file2: (LBL_A)

作为输出,然后您可以检查您的 perl 脚本或过滤sed -n 's/\(.*\): (LBL_A)/\1/p'(假设文件名中没有冒号)。

更新:正如 VonC 正确指出的那样,上面的命令对于带有空格的文件将失败。要处理该运行:

cleartool find ... -print | tr '\012' '\000' | xargs -0 cleartool ....

这会将换行符转换为 ascii null,然后让 xargs 将其用作分隔符。

于 2009-06-24T11:40:23.740 回答
6

您可以直接执行此操作而无需管道:

cleartool find . -ver "lbtype(LBL_A) && !lbtype(LBL_B)" -print
于 2009-09-05T23:48:29.240 回答
2

hlovdal 的回答说明,在这种情况下,您必须找到比您需要的更多的元素,然后过滤它们(尽管有所有ClearCase 查找功能)。

笔记:

 cleartool find . -type f -element 'lbtype_sub(LBL_A)' -print

可以直接给你元素(而不是在这种情况下可能不感兴趣的版本)。您可以找到带有-version格式指令的版本,如下所述。

在fmt_ccase的帮助下,您可以定制输出以准确获取您的 perl 脚本需要继续执行的操作:

 cleartool find . -type f -element 'lbtype_sub(LBL_A)' -exec 'cleartool describe -fmt "%En %Cl\n" \"$CLEARCASE_XPN\"' | grep -v ","
  • -fmt "%En %l\n"将显示元素的完整路径(而不是版本:/a/b/myFile@@/main/myVersion)=> /a/b/myFile'. the '\n` 确保每行一个结果。
  • -version-fmt "%n %l\n"会显示版本
  • \"$CLEARCASE_XPN\": 发现的版本的扩展路径周围的双引号确保名称中包含空格的文件仍然有效。
  • grep -v ",": 如果有逗号,则表示“多个标签”
  • %Cl:避免显示所有标签列表。反正如果不止一个,你就没兴趣了!

因此,为了找到确切的版本

 cleartool find . -type f -version 'lbtype_sub(LBL_A)' -exec 'cleartool describe -fmt "%n %Cl\n" \"$CLEARCASE_XPN\"' | grep -v ","|awk '{sub(/ \(.*/,"");print}'

注意:
以上适用于 unix 语法。Windows 语法将是:

cleartool find . -type f -element "lbtype(LBL_A)" -exec "cleartool describe -fmt \"%n %Cl\n\" \"%CLEARCASE_XPN%\"" | grep -v "," | gawk "{gsub(/ \(.*,"");print}"

,这将列出只有一个(正确)标签的文件版本。

  • awk '{sub(/ \(.*/,"");print}'将“ myFile@@/main/myVersion (LBL_A)”转换为“myFile@@/main/myVersion”
于 2009-06-24T12:29:46.670 回答