由于我们的项目多年来不断发展,许多.cs文件已从项目中删除,重命名等,但仍保留在源代码管理中。因此,当您提取最新代码时,您将获得所有.csproj文件中不再引用的.cs文件。
任何人都知道一种简单,可靠的机制来检测这些文件并将其删除吗?
答案 0 :(得分:5)
最好使用脚本语言完成此任务。我发现powershell非常适合这种情况。
第1步是找到csproj文件中包含的所有实际.cs文件。以下函数将在目录结构中搜索所有csproj文件,并返回这些文件中包含的.cs文件集
function Get-IncludedCsFiles() {
param ( $rootPath = $(throw "Need a path") )
$projFiles = gci -re -in *.csproj $rootPath
foreach ( $file in $projFiles ) {
$dir = split-path $file.FullName
foreach ( $line in (gc $file) ) {
if ( $line -match 'Compile\s+Include="([^"]+)"' ) {
join-path $dir $matches[1]
}
}
}
}
现在您需要做的就是将其包装到字典中,然后在目录结构中进行搜索
$map = @{}
$pathToSearch = "Path\To\Search"
Get-IncludedCsFiles $pathToSearch |
%{
if(!$map.Contains($_))
{
$map.Add($_, $true)
}
}
$notIncluded = gci -re -in *.cs $path | ?{ -not $map.Contains($_.FullName) }
答案 1 :(得分:4)
在VS解决方案资源管理器中尝试“显示所有文件”。
答案 2 :(得分:1)
目前我手头还没有VS,但是解决方案资源管理器中没有“在项目中显示文件”选项吗?
答案 3 :(得分:1)
前段时间我做了一个小项目。可用here。
答案 4 :(得分:1)
感谢JaredPar的解决方案!因为这对我来说要容易得多:) 你提供的有点强大的版本。
function Get-IncludedCsFiles()
{
param ( $rootPath = $(throw "Need a path") )
$projFiles = gci -re -in *.csproj $rootPath
foreach ( $file in $projFiles )
{
$dir = split-path $file.FullName
foreach ( $line in (gc $file) )
{
$correctedLine = $line -replace '%28', '(' #some files have "(" in them, and csproj changes them for %28
$correctedLine = $correctedLine -replace '%29', ')'
if ($correctedLine -match 'Compile\s+Include="([^"]+)"')
{
$filepath = join-path $dir $matches[1]
[System.IO.Path]::GetFullPath($filePath)#this resolves path (removes \..\)
}
}
}
}
$tempFilePattern = '*\obj\*'
$map = @{}
$pathToSearch = "Path to search"
$resultFilePath = [io.path]::combine($pathToSearch, 'notIncluded.txt')
Get-IncludedCsFiles $pathToSearch |
%{
if(!$map.Contains($_))
{
$map.Add($_, $true)
}
}
echo "Map created"
$notIncluded = gci -re -in *.cs $path | ?{ (-not $map.Contains($_.FullName)) -and !($_ -like $tempFilePattern)} | %{$_.FullName}
$notIncluded | Out-File $resultFilePath
$notIncluded |
%{
#tf delete $_ #Remove from TFS
}
它还考虑了名称中包含括号的文件,与csproj(或其下的子文件夹)不在同一文件夹中的文件。此外,它不包含使用编译(/ obj /文件夹)创建的临时生成的文件。 它列出了输出文件中的所有路径,您甚至可以从TFS中删除它们。
答案 5 :(得分:0)
可以避免此问题的一种方法是程序性的: (适用于除“网站”项目之外的任何项目,该项目没有项目文件):
不要从源代码控制工具中“获取最新”,而是始终在Visual Studio中执行“从源代码控制中打开”,并从解决方案资源管理器中获取最新信息。 VS只会提取属于项目的文件。
这不是一个完美的答案 - 当您执行合并时,您可能最终会删除分支中的每个文件,但它对我们来说非常有效。
(当然,这要求您使用提供VS集成的源代码控制工具 - 它还要求您将任何未编译但必需的文件(图标等)添加到项目中,否则它们不会被VS拉下来。