在文件中查找:搜索Team Foundation Server中的所有代码

Mar*_*rie 100 tfs search visual-studio-2008 code-search-engine

有没有办法在TFS中搜索特定字符串或正则表达式的每个文件的最新版本?这可能是我唯一想念的Visual Source Safe ......

目前我在整个代码库上执行Get Latest并使用Windows Search,但是在75,000个文件中超过1GB的代码会非常痛苦.

编辑:尝试提到的powertools,但"通配符搜索"选项似乎只搜索文件名而不是内容.

更新:我们在现有的MOSS(Search Server)安装中实现了自定义搜索选项.

Gra*_*day 57

Team Foundation Server 2015(内部部署)和Visual Studio Team Services(云版本)包括对搜索所有代码和工作项的内置支持.

您可以执行简单的字符串搜索,例如foo布尔操作foo OR bar或更复杂的特定于语言的操作class:WebRequest

代码搜索过滤器语法的屏幕截图

您可以在此处阅读更多相关信息:https://www.visualstudio.com/en-us/docs/search/overview

  • 请参阅下面的答案,并进行投票;)现在可以使用`Code Search`插件从TFS 2015开始.https://marketplace.visualstudio.com/items?itemName=ms.vss-code-search (2认同)

小智 14

就我而言,在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;
    }
}
}
Run Code Online (Sandbox Code Playgroud)


mar*_*kom 13

如果您安装TFS 2008 PowerTools,您将在团队资源管理器右键菜单中获得"在源代码管理中查找"操作.

TFS2008电动工具

  • 我认为只搜索文件/文件夹名称 (15认同)
  • -1电动工具不搜索文件**内容**,只搜索文件/文件夹名称. (9认同)
  • @muerte很有趣,他们被称为'电动工具'.有些人会说像做回滚一样是"基本功能".:-) (4认同)
  • 好的答案,死链接:http://www.microsoft.com/downloads/details.aspx?FamilyID = fbd14eea-781f-45a1-8c46-9f6ba2f68bf0 &DisplayLang = en (3认同)

Vin*_*Vin 13

还有另一种替代解决方案,似乎更具吸引力.

  1. 设置搜索服务器 - 可以是任何Windows机器/服务器
  2. 设置TFS通知服务* (Bissubscribe)以在每次签入时获取,删除,更新文件.因此,这是一个Web服务,其作用类似于TFS服务器上的侦听器,并更新/同步搜索服务器上的文件和文件夹.- 这将显着提高准确性(实时搜索),并避免一次性负载定期获取
  3. 在搜索服务器上为根文件夹设置索引服务/ Windows索引搜索
  4. 公开Web服务以返回搜索结果

现在通过上述所有设置,您可以为客户端提供一些选项:

  1. 设置一个网页来调用搜索服务并格式化结果以显示在网页上 - 您还可以将此网页集成到visual studio中(通过宏或加载项)
  2. 创建一个Windows客户端界面(winforms/wpf)来调用搜索服务并格式化结果并在UI上显示它们 - 您还可以通过VSPackage或加载项将此客户端工具集成到visual studio中

更新:我确实走了这条路,它一直很好用.只是想加入这个.

参考链接:

  1. 使用此工具而不是bissubscribe.exe
  2. 处理TFS事件
  3. 团队系统通知


Ger*_*ers 6

我们为Team Foundation Server源代码控制(不是你提到的SourceSafe)设置了一个类似于Grant建议的解决方案; 预定TF Get,Search Server Express.但是,用于C#文件(文本)的IFilter没有给出我们想要的结果,因此我们将源文件转换为.htm文件.我们现在可以向文件中添加其他元数据,例如:

  • 作者(我们将其定义为最后签入文件的人)
  • 颜色编码(在我们的待办事项清单上)
  • 指示潜在设计问题的更改数量(在我们的待办事项列表中)
  • 与Koders SmartSearch功能一样集成VSTS IDE
  • 等等

但是,我们更喜欢TFS源代码控制的协议处理程序,以及专用的源代码IFilter,用于更具针对性的解决方案.


小智 6

好的,

  1. TFS2008 Power Tools 没有 find-in-files功能."查找源代码管理工具提供了通过项目状态通配符表达式查找源代码管理中的文件和文件夹的功能."

  2. CodePlex上发布了一个具有此功能的Windows程序.我刚刚安装并测试了它,效果很好.


dea*_*dog 6

现在,通过使用Code Search插件,可以在TFS 2015中实现.https://marketplace.visualstudio.com/items?itemName=ms.vss-code-search

搜索是通过Web界面完成的,不需要您将代码下载到本地计算机,这很好.