删除所有ClearCase视图私有文件的命令行

17

我正在寻找一条命令行,在Windows上从ClearCase视图中删除所有视图私有的文件和目录。 我也有Cygwin可用。

这篇文章中提供的脚本并不完全符合我的要求,因为我要处理大量的文件,并且希望无需逐个选择即可全部删除。


刚刚添加了一个更通用的命令行。如果您有任何评论或问题,明天早上我会进行审核。 - VonC
9个回答

22

一些说明:

  • ct lsprivate 对于动态视图很好用,但对于快照视图不是很适用。
  • ct ls -rec -view_only 以及 ct lsprivate 也会列出已检出的文件...我不确定你是否想删除这些文件...

如果想要列出私有文件(仅列出私有文件,而非可能需要保留的劫持文件),则需要一个命令:

  • 考虑到文件名中可能包含空格。
  • 不列出检出、劫持或隐藏的文件或符号链接。
  • 适用于快照和动态视图。
  • (额外加分) 不依赖外部Shell命令。

    for /F "usebackq delims=" %i in (`cleartool ls -r ^| find /V "Rule:" ^| find /V "hijacked" ^| find /V "eclipsed" ^| find /V "-->"`) do @echo "%i"

该命令将以纯Windows方式(无需外部Shell依赖)列出所有私有文件(跳过劫持/隐藏/已检出或非私有文件以及符号链接)。
@echo "%i" 替换为 del /F "%i",文件就被删除了。
请注意在 %i 周围使用双引号,以便正确显示/删除具有空格的文件名。 同时请注意 cleartool 参数 -nxn 的缺失,因为否则符号链接将无法区分,并且视图私有文件也不会进行装饰。

如果想要删除私有目录,请先使用 rmdir /S /Q "%i" 命令运行一次,然后再使用 del /F "%i" 命令运行一次。


每次我运行该命令时,它都非常缓慢,甚至超时。你有任何想法是为什么吗? - TNV
@TDN 不完全是这样的:它取决于视图的性质以及客户端和视图服务器之间的网络。 - VonC
@VonC 第一次运行命令时,我直接从命令窗口运行它,它可以正常工作。随后的几次,我使用<exec>从NAnt脚本中运行它,这时问题就出现了。似乎进程无法退出。 - TNV
1
@TDN,你可以尝试将该命令用 cmd /C 调用进行封装。cmd /C "..."。此外,在脚本中,您需要启用延迟扩展,并使用 %%i 代替 %i - VonC
我最终从批处理文件中调用了您的命令,使用%%i而不是%i,它起作用了!谢谢@VonC!!! - TNV
显示剩余4条评论

6

在 Windows 的 DOS 命令提示符下:

for /f "delims=" %f in ('cleartool lspriv -s -do -oth ^| sort /r') do @del /f /q "%f"

5
我知道可能还有更好的方法,但我总是回到这个方法:
ct lspriv | grep -v checkedout | xargs rm -rf

3

我一直都使用:

ct lsprivate  | xargs rm

1
我也是,但我会先运行“ct lsco -cvi -s -avo”命令查找任何已签出的文件,并在删除私有文件之前取消这些签出。 - Jonathan Leffler
1
你是否曾经好奇为什么一个四年前的帖子会突然遭到贴文投票的踩,而又没有任何解释?我是。 - Paul Tomblin
在那些偶爾發生的情況下,它確實讓我感到困惑。這也讓我感到煩躁,但我決定除非有人在對我進行投票攻擊(這種情況還沒有發生),否則我無法對未解釋的負評採取任何有價值的行動。 - Jonathan Leffler
我收到以下错误信息:“csh:参数列表太长。(C shell没有限制,但Windows NT内核确实施加了一个32,282个字符的限制。)” - user875036

2
在Unix(动态视图)中,一种非常有效的删除视图私有文件的技术是放弃该视图。首先保留cspec。并确保视图中没有检出文件。然后删除视图并重新创建一个新视图(名称相同,cspec相同,存储相同,但没有私有文件直到您创建它们)。
# With the view to be cleaned as your current view...
ct pwv -s > /tmp/viewname
viewname=$(</tmp/viewname)
ct catcs > /tmp/$viewname.cs
ct lsview -cvi | awk '{print $3;}' > /tmp/$viewname.vws
# The next line is the first dangerous line!
# It cancels all outstanding checkouts and removes the modified files
ct lsco -cvi -s -avo 2>/dev/null | xargs ct unco -rm  # Or: xargs ct ci -nc
exit            # Terminate the session in the view
viewname=$(</tmp/viewname)
rm /tmp/viewname
# The next line is the second dangerous line
ct rmview -tag $viewname
ct mkview -tag $viewname $(</tmp/$viewname.vws)
ct setcs  -tag $viewname /tmp/$viewname.cs
rm /tmp/$viewname.cs

您的所有私有文件都已经消失 - 而且您已经最小化了磁盘使用率。

如果你足够幸运只使用一个VOB,你可以省略'-avo'(所有VOBs)选项。'2>/dev/null'重定向会丢失无法访问的VOBs的错误信息 - 在我的环境中,除了我实际使用的十几个可访问的VOB之外,还有100多个可见但不可访问的VOB。

请注意,如果您将其打包为“rebuild.view”脚本,则会将视图名称作为参数(从视图外部工作 - 它不是当前视图),然后您可以在视图内部进行清理,使用不同的'lsview'选项获取所需的详细信息,并通常远离在/tmp中的临时存储(尽管您需要将cspec缓存到某个地方)。

另外需要注意的一点是 - 在释放自动程序之前,您需要确保已经进行了手动清理。例如,不应该存在任何签出。或者,编写脚本以拒绝删除视图,如果存在任何签出。


1
  1. 从CLI中列出查看私有文件,请执行以下命令:

    for /F "usebackq delims=" %i in (`cleartool lspriv -s ^| find /V "Rule:" ^| find /V "hijacked" ^| find /V "eclipsed"`) do @echo "%i"
    
  2. 从CLI中执行以下命令以删除查看私有文件:

    for /F "usebackq delims=" %i in (`cleartool lspriv -s ^| find /V "Rule:" ^| find /V "hijacked" ^| find /V "eclipsed"`) do del /F "%i"
    
  3. 将视图与项目同步:
    从项目资源管理器中选择流属性,转到视图选项卡,选择视图属性,然后单击“与项目同步”


1
在纯Windows环境下,您可以这样做:
for /F "delims=" %i IN ('ct lsprivate') DO rm -rf "%i"

1

最终我在Cygwin中使用了这个命令:

cleartool ls -recurse -view_only | sed -e 's:\\:/:g' | xargs rm -r

sed命令是必需的,用于将cleartool输出的Windows样式路径更改为Unix样式路径。可能有更有效的命令。这个命令会抛出很多错误,因为它删除了目录,然后在该目录下找到的任何先前发现的视图私有文件都将被rm未找到。但最终你会得到正确的结果。
编辑:VonC指出,这仅适用于动态ClearCase视图。

0

使用cygpath命令代替sed怎么样?
你可以在这里找到更多关于cygpath.exe的信息:
链接文本

将cygpath.exe与其他程序链接起来的方法是使用xargs。
例如:processA | xargs cygpath -u > my-path-in-unix-format.txt


我无法想出正确的方法将其与其他命令串联起来。如果您能想出来,请编辑您的答案以展示它;希望这能帮助其他人。 - mbyrne215

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接