파일에서 찾기 : Team Foundation Server에서 모든 코드 검색


102

특정 문자열 또는 정규식에 대해 TFS에있는 모든 파일의 최신 버전을 검색하는 방법이 있습니까? 이것은 아마도 Visual Source Safe에서 내가 놓친 유일한 것입니다 ...

현재 전체 코드베이스에 대해 최신 정보 얻기를 수행하고 Windows 검색을 사용하지만 75,000 개 파일에 1GB가 넘는 코드가 있으면 상당히 고통스러워집니다.

편집 : 언급 된 powertools를 시도했지만 "와일드 카드 검색"옵션이 내용이 아닌 파일 이름 만 검색하는 데 나타납니다.

업데이트 : 기존 MOSS (Search Server) 설치에 사용자 지정 검색 옵션을 구현했습니다.

답변:


57

Team Foundation Server 2015 (온-프레미스) 및 Visual Studio Team Services (클라우드 버전)에는 모든 코드 및 작업 항목 검색을위한 기본 제공 지원이 포함되어 있습니다.

foo, 같은 부울 연산 foo OR bar또는 다음 과 같은 더 복잡한 언어 관련 작업과 같은 간단한 문자열 검색을 수행 할 수 있습니다.class:WebRequest

코드 검색 필터 구문 스크린 샷

자세한 내용은 https://www.visualstudio.com/en-us/docs/search/overview에서 확인할 수 있습니다.


2
아래 내 대답을 참조하고 찬성하십시오;) 이것은 이제 Code Search플러그인 을 사용하여 TFS 2015부터 가능합니다 . marketplace.visualstudio.com/items?itemName=ms.vss-code-search
deadlydog

코드 검색은 현재 Visual Studio Team Services에서만 사용할 수 있습니다. Team Foundation Server에 대한 지원은 개발 중이며 다음 릴리스에 포함될 것입니다.
paparush

이제 TFS 2017 이상에서 코드 검색을 사용할 수 있습니다.
csrowell

해당 문서의 2015 버전으로 전환하려는 경우 : "요청한 페이지는 Team Foundation Server 2015에서 사용할 수 없습니다."
AaronLS

16

제 경우에는 C #으로 작은 유틸리티를 작성하는 것이 도움이되었습니다. 나를 도왔던 링크 -http : //pascallaurin42.blogspot.com/2012/05/tfs-queries-searching-in-all-files-of.html

tfs api를 사용하여 팀 프로젝트의 파일을 나열하는 방법은 무엇입니까?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.VersionControl.Client;
using Microsoft.TeamFoundation.Framework.Client;
using System.IO;

namespace TFSSearch
{
class Program
{
    static string[] textPatterns = new[] { "void main(", "exception", "RegisterScript" };  //Text to search
    static string[] filePatterns = new[] { "*.cs", "*.xml", "*.config", "*.asp", "*.aspx", "*.js", "*.htm", "*.html", 
                                           "*.vb", "*.asax", "*.ashx", "*.asmx", "*.ascx", "*.master", "*.svc"}; //file extensions

    static void Main(string[] args)
    {
        try
        {
            var tfs = TfsTeamProjectCollectionFactory
             .GetTeamProjectCollection(new Uri("http://{tfsserver}:8080/tfs/}")); // one some servers you also need to add collection path (if it not the default collection)

            tfs.EnsureAuthenticated();

            var versionControl = tfs.GetService<VersionControlServer>();


            StreamWriter outputFile = new StreamWriter(@"C:\Find.txt");
            var allProjs = versionControl.GetAllTeamProjects(true);
            foreach (var teamProj in allProjs)
            {
                foreach (var filePattern in filePatterns)
                {
                    var items = versionControl.GetItems(teamProj.ServerItem + "/" + filePattern, RecursionType.Full).Items
                                .Where(i => !i.ServerItem.Contains("_ReSharper"));  //skipping resharper stuff
                    foreach (var item in items)
                    {
                        List<string> lines = SearchInFile(item);
                        if (lines.Count > 0)
                        {
                            outputFile.WriteLine("FILE:" + item.ServerItem);
                            outputFile.WriteLine(lines.Count.ToString() + " occurence(s) found.");
                            outputFile.WriteLine();
                        }
                        foreach (string line in lines)
                        {
                            outputFile.WriteLine(line);
                        }
                        if (lines.Count > 0)
                        {
                            outputFile.WriteLine();
                        }
                    }
                }
                outputFile.Flush();
            }
        }
        catch (Exception e)
        {
            string ex = e.Message;
            Console.WriteLine("!!EXCEPTION: " + e.Message);
            Console.WriteLine("Continuing... ");
        }
        Console.WriteLine("========");
        Console.Read();
    }

    // Define other methods and classes here
    private static List<string> SearchInFile(Item file)
    {
        var result = new List<string>();

        try
        {
            var stream = new StreamReader(file.DownloadFile(), Encoding.Default);

            var line = stream.ReadLine();
            var lineIndex = 0;

            while (!stream.EndOfStream)
            {
                if (textPatterns.Any(p => line.IndexOf(p, StringComparison.OrdinalIgnoreCase) >= 0))
                    result.Add("=== Line " + lineIndex + ": " + line.Trim());

                line = stream.ReadLine();
                lineIndex++;
            }
        }
        catch (Exception e)
        {
            string ex = e.Message;
            Console.WriteLine("!!EXCEPTION: " + e.Message);
            Console.WriteLine("Continuing... ");
        }

        return result;
    }
}
}

13

더 매력적으로 보이는 또 다른 대안이 있습니다.

  1. 검색 서버 설정-모든 Windows 컴퓨터 / 서버 일 수 있습니다.
  2. 셋업 TFS 알림 서비스 * (Bissubscribe)를 얻을 삭제, 갱신 파일은 체크인이 발생 때마다. 따라서 이것은 TFS 서버에서 리스너처럼 작동하고 검색 서버에서 파일과 폴더를 업데이트 / 동기화하는 웹 서비스입니다. - 이것은 정확성 (실시간 검색)을 극적으로 향상시키고 주기적으로 가져 오는 일회성 부하를 피할 것입니다.
  3. 검색 서버에서 루트 폴더에 대한 인덱싱 서비스 / Windows 인덱싱 된 검색 설정
  4. 검색 결과를 반환하는 웹 서비스 노출

이제 위의 모든 설정을 통해 클라이언트에 대한 몇 가지 옵션이 있습니다.

  1. 검색 서비스를 호출하는 웹 페이지를 설정하고 웹 페이지에 표시 할 결과 형식을 지정합니다.이 웹 페이지를 Visual Studio 내에 통합 할 수도 있습니다 (매크로 또는 추가 기능을 통해).
  2. Windows 클라이언트 인터페이스 (winforms / wpf)를 만들어 검색 서비스를 호출하고 결과 형식을 지정하고 UI에 표시합니다. VSPackages 또는 추가 기능을 통해 Visual Studio 내에이 클라이언트 도구를 통합 할 수도 있습니다.

업데이트 : 나는이 경로를 갔고 잘 작동했습니다. 이것에 추가하고 싶었습니다.

참조 링크 :

  1. bissubscribe.exe 대신이 도구를 사용하십시오.
  2. TFS 이벤트 처리
  3. 팀 시스템 알림

12

TFS 2008 PowerTools를 설치하면 팀 탐색기 오른쪽 클릭 메뉴에 "소스 제어에서 찾기"작업이 표시됩니다.

TFS2008 전동 공구


4
@muerte '전동 도구'라고 불리는 것이 재밌습니다. 어떤 사람들은 롤백과 같은 일을하는 것이 '기본 기능'이라고 말할 것입니다. :-)
Iain Holder

글쎄, 당신은 확실히 수동으로 롤백을 할 수 있습니다. 그것은 단지 한 번의 클릭 작업이 아닙니다. 아마도 ..
Jeff Atwood

3
좋은 대답, 죽은 링크 : microsoft.com/downloads/…
wcm

15
난 단지 파일 / 폴더 이름을 검색 생각
얘야

9
-1 전동 공구는 파일 내용을 검색하지 않고 파일 / 폴더 이름 만 검색합니다 .
Eugene Beresovsky

6

Grant가 제안한 것과 유사한 Team Foundation Server 소스 제어 (언급 한대로 SourceSafe가 아님)에 대한 솔루션을 설정했습니다. 예정된 TF Get, Search Server Express. 그러나 C # 파일 (텍스트)에 사용 된 IFilter는 우리가 원하는 결과를 얻지 못했기 때문에 소스 파일을 .htm 파일로 변환했습니다. 이제 다음과 같은 추가 메타 데이터를 파일에 추가 할 수 있습니다.

  • 작성자 (파일을 마지막으로 확인한 사람으로 정의)
  • 색상 코딩 (해야 할 일 목록에 있음)
  • 잠재적 인 디자인 문제를 나타내는 변경 횟수 (할일 목록에 있음)
  • Koders SmartSearch 기능과 같은 VSTS IDE와 통합
  • 기타

그러나 우리는 TFS 소스 제어를위한 프로토콜 처리기와 훨씬 더 많은 목표를 가진 솔루션을위한 전용 소스 코드 IFilter를 선호합니다.


1
.htm 변환을 오픈 소스 할 계획이 있습니까?
technomalogical

6

괜찮아,

  1. TFS2008 전동 공구는 할 수 없습니다 검색 (find) -에 - 파일 기능을 가지고있다. "소스 제어에서 찾기 도구는 항목의 상태 또는 와일드 카드 표현식 으로 소스 제어에서 파일 및 폴더를 찾는 기능을 제공합니다 ."

  2. 이 기능을 가진 Windows 프로그램이 CodePlex에 게시되어 있습니다. 방금 설치하고 테스트했는데 잘 작동합니다.


벗겨지고 느리지 만 주석에 표시된대로하는 것 같습니다
Paul Michaels

이 사람들이 아래 링크에서 얻은 것과 같은 오류가 발생합니다. 이것을 경험하는 다른 사람이 있습니까? tfssearchcode.codeplex.com/workitem/32475
스트라이더

6

이제 Code Search플러그인 을 사용하여 TFS 2015부터 가능합니다 . https://marketplace.visualstudio.com/items?itemName=ms.vss-code-search

검색은 웹 인터페이스를 통해 이루어지며 코드를 로컬 컴퓨터에 다운로드 할 필요가 없습니다.


참고 : 코드 검색은 현재 Visual Studio Team Services에서만 사용할 수 있습니다. Team Foundation Server에 대한 지원은 개발 중이며 다음 릴리스에 포함될 것입니다.
Jamie

3

또 다른 해결책은 "ctrl + shift + F"를 사용하는 것입니다. 솔루션이나 프로젝트가 아닌 로컬 디렉토리로 검색 위치를 변경할 수 있습니다. 이것은 데스크톱 검색을 대신 할 뿐이며 여전히 최신 코드를 가져와야하지만 Visual Studio 내에서 검색을 수행 할 수 있습니다.


4
TFS 코드 버전을 통한 검색 문제를 해결하지 않습니다.
크레이그

그들이 원하는 것이 아닙니다.
Dave

다운로드하지 않은 콘텐츠 검색에는 소용이 없습니다. grep / findstr을 사용할 수도 있습니다.
Jamie

2

Notepad ++ 가 있다고 가정 할 때 자주 놓치는 기능은 '파일에서 찾기'로 매우 빠르며 필터, 정규식, 바꾸기 및 모든 N ++ 기능이 함께 제공됩니다.


1

이 추가 기능은 사용자가 찾는 기능이 있다고 주장합니다.

팀 재단 조수


파일 내부 검색을 제공하는 곳이 보이지 않나요?
Mark Glorie

4
Atually 이전에이 플러그인 세트를 다운로드했으며 작성자, 레이블, 날짜 등으로 만 검색 할 수 있지만 이전 버전의 파일 내에서는 검색 할 수 없습니다 ... : \
Sandor Davidhazi

1

이 파일 링크 검색은 파일을 찾는 방법을 설명합니다. 나는 그것을 작동시키기 위해 충고를 가지고 돌아다녀야했다.

  1. cd "C : \ Program Files (x86) \ Microsoft Visual Studio 12.0 \ Common7 \ IDE"
  2. tf dir "$ / *. sql"/ recursive / server : http : // mytfsserver : 8080 / tfs

cd 명령의 경우 tf.exe 파일을 찾고 있었기 때문에 cd 명령을 수행했습니다. 전체 경로를 추가하는 그 디렉토리 구절에서 시작하는 것이 더 쉬웠습니다. 이제이 작업을 수행하는 방법을 이해 했으므로 따옴표로 묶인 절대 경로를 사용하겠습니다.

tf 검색의 경우 서버 루트에서 시작 $/하여 sqlie로 끝나는 모든 파일을 검색했습니다 *.sql. 루트에서 시작하지 않으려면 "$/myproject/*.sql"대신 사용하십시오.

오! 이것은 질문의 파일 부분 검색을 해결하지 못하지만 내 Google 검색은 다른 링크 중에서 파일을 찾기 위해 여기로 왔습니다.


1

현재이 작업을 즉시 수행 할 수있는 방법은 없지만 추가를위한 사용자 음성 제안이 있습니다. http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2037649-implement-indexed- 작업 항목의 전체 텍스트 검색

나는 그것이 스위치를 켜는 것만 큼 간단하다고 생각하지 않지만,이 질문을 본 모든 사람들이 그것에 투표한다면 MS는 아마도 무언가를 구현할 것입니다.

업데이트 : 이 요청이 레이더에있는 것으로 표시되는 Brian Harry의 블로그를 읽으십시오 . 온라인 버전의 Visual Studio는 git이 vcs로 사용되는 검색을 제한적으로 지원합니다. http://blogs.msdn.com/b/ visualstudioalm / archive / 2015 / 02 / 13 / announcing-limited-preview-for-visual-studio-online-code-search.aspx . 이것에서 나는 그것이 단지 시간 문제라고 말하는 것이 공평하다고 생각합니다 ...

업데이트 2 : 이제 Microsoft에서 제공하는 확장 기능인 코드 검색 을 통해 코드와 작업 항목에서 검색 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.