2009-04-17 26 views
4

私たちのプロジェクトが進化して以来、多くの.csファイルがプロジェクトから削除され、名前が変更されましたが、それらはソース管理のままです。したがって、最新のコードを取得すると、.csprojファイルで参照されなくなったこれらの.csファイルがすべて取得されます。プロジェクト内に存在しない.CSファイルをプロジェクトフォルダ内で見つける方法を教えてください。

これらのファイルを検出して排除する簡単で信頼性の高い方法を知っている人はいますか?

+0

効果的には、http://stackoverflow.com/questions/707113/in-visual-studio-whats-a-quickway-to-delete-all-the-exclude-files-from-a-proje –

+0

私は、これらのファイルはソース管理でのみ存在し、特別なマーカーを持っていると思います。私はあなたが直接ソースコントロールから削除しようとすると思います – isxaker

答えて

5

このタスクにはスクリプト言語を使用することをお勧めします。私は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) } 
1

現時点ではVSが手元にありませんが、ソリューションエクスプローラで[プロジェクトにファイルを表示しない]オプションはありませんか?

+0

ソリューションエクスプローラのツールバーの "すべてのファイルを表示"です。 – Richard

4

VSソリューションエクスプローラで[すべてのファイルを表示]を試してください。あなたはこの問題を回避することができ

0

一つの方法は、手続きです:から「最新の入手」で行うので代わりに

: は(何のプロジェクトファイルを持っていない「のWebサイト」プロジェクトを除く任意のプロジェクトのために動作します)あなたのソース管理ツールは、常にVisual Studio内で「ソース管理から開く」を行い、ソリューションエクスプローラから最新のものを入手してください。 VSはプロジェクトに属するファイルのみをプルします。

これは完璧な答えではありません。マージを実行すると、ブランチのすべてのファイルをプルダウンする可能性が高くなりますが、非常にうまく機能しています。

(もちろん、VS統合を提供するソース管理ツールを使用する必要があります。また、コンパイルされていないが必要なファイル(アイコンなど)もプロジェクトに追加する必要があります。 VSによって引っ張られない)。

1

私はこの前にこの小さなプロジェクトを作った。利用可能なhere

+0

非常に参考になるプロジェクト!そして非常に速い! –

1

ありがとうございました!そのため、それは私にとってはるかに簡単でした:) あなたが提供しているものの少し強力なバージョン。

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/folder)は含まれません。 出力ファイル内のすべてのパスを一覧表示し、それらをTFSから削除することもできます。

関連する問題