문제

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

현재 전체 코드베이스에 대해 최신 가져오기를 수행하고 Windows 검색을 사용하고 있지만 75,000개 파일에 1GB가 넘는 코드가 있어서 상당히 고통스럽습니다.

편집하다:언급된 강력한 도구를 사용해 보았지만 "와일드카드 검색" 옵션은 내용이 아닌 파일 이름만 검색하는 것으로 나타납니다.

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

도움이 되었습니까?

해결책

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

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

screenshot of code search filter syntax

자세한 내용은 여기에서 읽어보세요. https://www.visualstudio.com/en-us/docs/search/overview

다른 팁

내 경우에는 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;
    }
}
}

더 매력적으로 보이는 또 다른 대체 솔루션이 있습니다.

  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. 팀 시스템 알림

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

TFS2008 전동 공구

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

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

그러나 우리는 TFS 소스 제어를 위한 프로토콜 핸들러와 훨씬 더 타겟화된 솔루션을 위한 전용 소스 코드 IFilter를 선호합니다.

좋아요,

  1. TFS2008 전동 공구는 ~ 아니다 파일에서 찾기 기능이 있습니다."소스 제어에서 찾기 도구는 항목의 소스 제어에서 파일과 폴더를 찾는 기능을 제공합니다. 상태 또는 와일드카드 표현."

  2. 이 기능이 포함된 Windows 프로그램이 게시되어 있습니다. 코드플렉스.방금 설치하고 테스트해봤는데 잘 작동됩니다.

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

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

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

이 추가 기능에는 귀하가 원하는 기능이 있다고 주장합니다.

팀 파운데이션 사이드킥

파일 검색 링크는 파일을 찾는 방법을 설명합니다. 나는 그것이 작동하도록 조언을 가지고 주변을 둘러보아야했습니다.

  1. cd "C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE"
  2. tf dir "$/*.sql" /재귀적 /서버:http://mytfs서버:8080/tfs

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

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

오!이것은 질문의 파일 부분 검색을 해결하지 못하지만 Google 검색을 통해 다른 링크 중에서 파일을 찾을 수 있도록 여기로 이동했습니다.

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

현재로서는 이 작업을 즉시 수행할 수 있는 방법이 없지만 이를 추가하기 위한 사용자 음성 제안이 있습니다. http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2037649-implement-indexed-full-text-search-of-work-items

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

업데이트:그냥 읽어보세요 브라이언 해리의 블로그, 이는 이 요청이 레이더에 있는 것으로 표시하며 Visual Studio의 온라인 버전은 git이 vc로 사용되는 검색에 대한 지원이 제한되어 있습니다. http://blogs.msdn.com/b/visualstudioalm/archive/2015/02/13/announce-limited-preview-for-visual-studio-online-code-search.aspx.이쯤 되면 시간 문제라고 보는 게 타당할 것 같은데...

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top