隨着我們的項目多年來不斷演變,許多.cs文件已從項目中刪除,重命名等,但仍保留在源代碼管理中。因此,當您拉取最新的代碼時,您將獲得所有這些不再在任何.csproj文件中引用的.cs文件。如何在項目文件夾中找到不在項目中的.CS文件?
任何人都知道檢測這些文件並消除它們的簡單可靠的機制?
隨着我們的項目多年來不斷演變,許多.cs文件已從項目中刪除,重命名等,但仍保留在源代碼管理中。因此,當您拉取最新的代碼時,您將獲得所有這些不再在任何.csproj文件中引用的.cs文件。如何在項目文件夾中找到不在項目中的.CS文件?
任何人都知道檢測這些文件並消除它們的簡單可靠的機制?
對這項任務最好使用腳本語言。我發現PowerShell非常適合這種情況。
第1步是查找所有包含在csproj文件中的.cs文件。下面的函數將搜索的目錄結構爲所有的csproj文件,並返回一組包含在這些文件
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]
}
}
}
}
現在,所有你需要做的是換行到一個字典,然後做一個搜索的.cs文件在目錄結構中
$map = @{}
$pathToSearch = "Path\To\Search"
Get-IncludedCsFiles $pathToSearch |
%{
if(!$map.Contains($_))
{
$map.Add($_, $true)
}
}
$notIncluded = gci -re -in *.cs $path | ?{ -not $map.Contains($_.FullName) }
我目前沒有VS,但在解決方案資源管理器中沒有「Show Files Not in Project」選項?
這是解決方案資源管理器工具欄上的「顯示所有文件」。 – Richard 2009-04-17 15:09:13
嘗試VS解決方案資源管理器中的「顯示所有文件」。你能避免這個問題
一種方式是程序: (適用於除一個「網站」項目中的任何項目,沒有項目文件):
而不是做從「獲取最新」的您的源代碼管理工具始終在Visual Studio中執行「從源代碼管理打開」,並從解決方案資源管理器獲取最新信息。 VS只會提取屬於該項目的文件。
這不是一個完美的答案 - 當你執行合併時,你最終可能會拖下你的分支中的每個文件,但它對我們來說工作得很好。 (當然,這需要你使用一個提供VS集成的源代碼控制工具 - 它還要求你添加任何未編譯但需要的文件(圖標等)到你的項目中,否則他們會不會被VS拉下)。
我前段時間做了一個小項目。可用here。
感謝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中刪除它們。
Effectively a dup of http://stackoverflow.com/questions/707113/in-visual-studio-whats-a-quick-way-to-delete-all-the-exclude-files-from-a-proje – 2009-04-17 14:37:06
我認爲,這些文件只存在於源代碼管理中,並且有特殊標記。我想你會嘗試直接從源代碼控制中刪除 – isxaker 2015-11-13 10:52:25