ClearCase:查找只有一个特定标签的文件,而不是更多

时间:2009-06-24 10:55:07

标签: clearcase labels cleartool

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

例如,如果我的文件标记为:

file1 LBL_A, LBL_B
file2 LBL_A

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

有没有办法用cleartool找到这个?如果单个查询无法做到这一点,我也很高兴有任何想法如何在几个步骤中执行此操作(我将从perl脚本调用cleartool,因此保存文件列表很容易暂时并在它们上运行更多命令。)

提前多多感谢!

3 个答案:

答案 0 :(得分: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将其用作分隔符。

答案 1 :(得分:6)

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

cleartool find . -ver "lbtype(LBL_A) && !lbtype(LBL_B)" -print

答案 2 :(得分:2)

hlovdal's answer说明,在这种情况下,您必须找到比您需要的更多元素,然后过滤它们(尽管ClearCase find features)。

注意:

 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”