我正在寻找一个命令行来从 Windows 上的 ClearCase 视图中删除所有视图私有文件和目录。我也有 Cygwin 可用。
本文中提供的脚本并不是我想要的,因为我正在处理大量文件并且想要将它们全部删除而不必选择每个文件。
几点说明:
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 的缺失,否则符号链接将无法区分,并且无论如何都不会修饰视图私有文件。
为了也摆脱私有目录,首先运行命令 withrmdir /S /Q "%i"
然后 with del /F "%i"
。
在 windows DOS 提示符下:
for /f "delims=" %f in ('cleartool lspriv -s -do -oth ^| sort /r') do @del /f /q "%f"
I know that there is probably a better way but I always seem to come back to this one:
ct lspriv | grep -v checkedout | xargs rm -rf
I've always used:
ct lsprivate | xargs rm
在 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
'(所有 VOB)选项。' 2>/dev/null
' 重定向会丢失来自无法访问的 VOB 的错误 - 我的环境中有 100 多个可见但无法访问的 VOB,除了我真正使用的十几个可访问的 VOB。
请注意,如果您将其打包为“ rebuild.view
”脚本,则将视图名称作为参数(从视图外部工作 - 它不是当前视图),然后您可以在视图内部进行清理,使用一个不同的 'lsview' 选项来获取所需的详细信息,并且通常远离 /tmp 中的临时存储(尽管您需要在某处缓存 cspec)。
还有一点需要注意 - 您需要确保在自动松开之前已完成手动清理。例如,不应该有结帐。或者,如果有任何结帐,编写脚本以拒绝删除视图。
我最终在 Cygwin 中使用了这个命令:
cleartool ls -recurse -view_only | sed -e 's:\\:/:g' | xargs rm -r
sed 是将 cleartool 输出的 Windows 样式路径更改为 Unix 样式路径所必需的。那里可能有更有效的命令。这会引发很多错误,因为它会删除目录,然后 rm 将找不到该目录下的任何先前找到的视图私有文件。但你最终会得到正确的结果。
编辑:VonC 指出这只适用于动态 ClearCase 视图
从 CLI 要列出查看私有文件,请执行以下命令
for /F "usebackq delims=" %i in (`cleartool lspriv -s ^| find /V "Rule:" ^| find /V "hijacked" ^| find /V "eclipsed"`) do @echo "%i"
从执行以下命令的 CLI 删除查看私有文件
for /F "usebackq delims=" %i in (`cleartool lspriv -s ^| find /V "Rule:" ^| find /V "hijacked" ^| find /V "eclipsed"`) do del /F "%i"
将视图与项目同步:
从项目资源管理器中选择流属性,转到视图选项卡,选择视图属性,然后单击“与项目同步”
在纯窗口中,您可以这样做:
for /F "delims=" %i IN ('ct lsprivate') DO rm -rf "%i"
使用 cygpath 命令代替 sed 怎么样?
您可以在此处找到有关 cygpath.exe 的更多信息:
链接文本
将 cygpath.exe 与其他程序链接的一种方法是使用 xargs。
示例:进程A | xargs cygpath -u > my-path-in-unix-format.txt