离线清理TFS(TFVC)本地工作区未版本化文件
离线清理TFS本地工作区未版本化文件方案
问题背景
我用Visual Studio 2017创建了Team Foundation Server(TFS)本地工作区,其中包含大量编译/测试过程中生成的未版本化文件,这些文件未纳入TFS仓库管理,必须在未连接TFS服务器的离线状态下删除它们。
遇到的实际困难:
- Windows资源管理器中,这些文件和文件夹没有显示TFS图标叠加层,手动清理易出错且耗时;
- 项目规模庞大、结构不一致,无法通过扩展名或文件夹名称定义规则来查找所有未版本化文件。
已尝试的方案及局限:
- 使用命令
tf.exe info可获取未版本化文件列表用于脚本,但该列表会排除TFS忽略的文件,且未找到修改TFS忽略文件列表的方法; - TFS在
HKLM\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers中注册了图标叠加处理程序(IShellIconOverlayIdentifier接口),编写程序调用其中的IsMemberOf方法时,OneDrive的处理程序可正常工作,但TFS处理程序始终返回S_FALSE(1)。
可行解决方案
方案1:基于TFS本地缓存筛选并删除未版本化文件
TFS本地工作区会在根目录的隐藏.tf文件夹中保存已版本化文件的缓存信息,离线状态下可借助该缓存对比筛选:
- 导出已版本化文件列表:
在工作区根目录打开命令提示符,执行:
离线状态下tf.exe status /format:detailed /recursive > versioned_files.txttf.exe可读取本地缓存,输出所有已版本化文件的完整路径。 - 用PowerShell脚本对比删除:
以下脚本会遍历工作区所有文件,排除已版本化文件和.tf缓存文件夹,预览要删除的未版本化文件:
确认预览结果无误后,去掉$versionedFiles = Get-Content "versioned_files.txt" | Select-String -Pattern "^[^ ]+ [^ ]+ (.+)$" | ForEach-Object { $_.Matches.Groups[1].Value } Get-ChildItem -Path "你的工作区根目录路径" -Recurse -File | Where-Object { $_.FullName -notin $versionedFiles -and $_.FullName -notlike "*\.tf\*" } | Remove-Item -WhatIf-WhatIf参数执行实际删除。
方案2:使用TFS Power Tools的tfpt scorch命令
TFS Power Tools的scorch命令专门用于清理工作区中未版本化的文件,离线状态下可基于本地缓存运行:
- 确保安装对应Visual Studio 2017版本的TFS Power Tools;
- 在工作区根目录执行:
tfpt scorch /recursive /noprompt /preview/preview参数用于预览待删除文件,确认后移除该参数即可执行清理。该命令会自动识别所有已版本化文件,删除所有不在版本控制中的内容,包括原被TFS忽略的文件。
方案3:修改TFS忽略规则后用tf.exe处理
如果要让tf.exe info包含被忽略的文件,可修改忽略规则:
- 在工作区根目录找到或新建
.tfignore文件; - 注释掉(前缀加
#)或删除不需要的忽略条目; - 离线执行:
此时生成的列表会包含原被忽略的未版本化文件,再通过脚本批量删除即可。tf.exe info /recursive /unversioned > unversioned_files.txt
内容的提问来源于stack exchange,提问作者Herbert220930
相关产品推荐
相关产品推荐

