2009-04-17 2 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의 dup –

+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

한 가지 방법은 절차 적이다 : A는에서 "최신 얻을"일을하는 대신

: 은 (어떤 프로젝트 파일이없는 "웹 사이트"프로젝트를 제외한 모든 프로젝트, 작동) 소스 제어 도구는 항상 Visual Studio 내에서 "소스 제어에서 열기"를 수행하고 솔루션 탐색기에서 최신 항목을 가져옵니다. VS는 프로젝트에 속한 파일 만 가져옵니다.

완벽한 대답은 아닙니다. 병합을 수행하면 지점의 모든 파일이 다운 될 가능성이 있지만, 우리에게는 매우 효과적입니다.

(물론 VS 통합을 제공하는 소스 제어 도구를 사용해야합니다. 컴파일되지 않았지만 필수 파일 (아이콘 등)을 프로젝트에 추가해야합니다. VS에 의해 당겨지지 않는다).

1

저는 얼마 전이 작은 프로젝트를 만들었습니다. 이용 가능 here.

+0

매우 유용한 프로젝트! 그리고 매우 빨리! –

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에서 제거 할 수 있습니다.

관련 문제