【发布时间】:2008-12-15 21:04:36
【问题描述】:
我正在寻找一个命令行来从 Windows 上的 ClearCase 视图中删除所有视图私有文件和目录。我也有 Cygwin。
this article 上提供的脚本并不是我想要的,因为我正在处理大量文件并且想要将它们全部删除而不必选择每个文件。
【问题讨论】:
-
刚刚添加了一个更通用的命令行。如果您有任何意见/问题,我将在明天早上查看您的评论/问题。
我正在寻找一个命令行来从 Windows 上的 ClearCase 视图中删除所有视图私有文件和目录。我也有 Cygwin。
this article 上提供的脚本并不是我想要的,因为我正在处理大量文件并且想要将它们全部删除而不必选择每个文件。
【问题讨论】:
几点说明:
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 依赖)列出您的所有私有文件(跳过被劫持/eclipse/签出或非私有文件以及符号链接)。
将@echo "%i" 替换为del /F "%i",它们就消失了。
请注意 %i 周围的双引号,以便正确显示/删除名称中带有空格的文件。
另请注意 cleartool 参数 -nxn 的缺失,否则符号链接将无法区分,并且无论如何都不会修饰视图私有文件。
为了也摆脱私有目录,首先使用rmdir /S /Q "%i" 运行命令,然后使用del /F "%i"。
【讨论】:
cmd /C 调用中吗? cmd /C "..."。同样在脚本中,您需要启用延迟扩展,并使用%%i 而不是%i。
windows DOS提示符下:
for /f "delims=" %f in ('cleartool lspriv -s -do -oth ^| sort /r') do @del /f /q "%f"
【讨论】:
我知道可能有更好的方法,但我似乎总是回到这个:
ct lspriv | grep -v checkedout | xargs rm -rf
【讨论】:
我一直用:
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"
将视图与项目同步:
从项目资源管理器中选择流属性,转到视图选项卡,选择视图属性然后单击“与项目同步”
【讨论】:
用 cygpath 命令代替 sed 怎么样?
您可以在此处找到有关 cygpath.exe 的更多信息:
link text
将 cygpath.exe 与其他程序链接的一种方法是使用 xargs。
示例:进程A | xargs cygpath -u > my-path-in-unix-format.txt
【讨论】:
在纯窗口中你可以这样做:
for /F "delims=" %i IN ('ct lsprivate') DO rm -rf "%i"
【讨论】: