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

时间:2008-09-03 01:49:04

标签: visual-studio-2008 search tfs code-search-engine

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

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

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

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

12 个答案:

答案 0 :(得分:56)

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

答案 1 :(得分:14)

就我而言,在C#中编写一个小实用程序是有帮助的。 帮助我的链接 - http://pascallaurin42.blogspot.com/2012/05/tfs-queries-searching-in-all-files-of.html

How to list files of a team project using 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;
    }
}
}

答案 2 :(得分:13)

如果您安装TFS 2008 PowerTools,您将在Team Explorer右键菜单中获得“在源代码管理中查找”操作。

TFS2008 Power Tools

答案 3 :(得分:13)

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

  1. 设置搜索服务器 - 可以是任何Windows机器/服务器
  2. 设置 TFS通知服务* (Bissubscribe)获取,删除, 每次签入时都会更新文件 发生。所以这是一个Web服务 就像TFS上的倾听者一样 服务器,并更新/同步文件 和搜索服务器上的文件夹。 - 这将显着提高准确性(实时搜索),并避免一次性负载定期获取
  3. 设置索引服务/窗口 搜索服务器上的索引搜索 对于根文件夹
  4. 公开网络服务以返回 搜索结果
  5. 现在通过以上所有设置,您可以为客户端提供一些选项:

    1. 设置网页以调用搜索服务并格式化结果以显示在网页上 - 您还可以将此网页集成到visual studio中(通过宏或加载项)
    2. 创建一个Windows客户端界面(winforms / wpf)来调用搜索服务并格式化结果并在UI上显示它们 - 您还可以通过VSPackage或加载项在Visual Studio中集成此客户端工具
    3. <强>更新: 我确实走了这条路,它一直很好用。只是想加入这个。

      参考链接:

      1. Use this tool instead of bissubscribe.exe
      2. Handling TFS events
      3. Team System Notifications

答案 4 :(得分:6)

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

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

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

答案 5 :(得分:6)

好,

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

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

答案 6 :(得分:6)

现在可以使用Code Search插件从TFS 2015开始。 https://marketplace.visualstudio.com/items?itemName=ms.vss-code-search

搜索是通过网络界面完成的,不需要您将代码下载到本地机器上,这很好。

答案 7 :(得分:3)

另一个解决方案是使用“ctrl + shift + F”。您可以将搜索位置更改为本地目录,而不是解决方案或项目。这将取代桌面搜索,您仍然需要获取最新的代码,但它将允许您保留在Visual Studio中进行搜索。

答案 8 :(得分:1)

此加载项声称具有我认为您寻求的功能:

Team Foundation Sidekicks

答案 9 :(得分:1)

目前无法开箱即用,但有一个用户语音建议可以添加它:http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2037649-implement-indexed-full-text-search-of-work-items

虽然我怀疑它就像翻转开关一样简单,如果每个看过这个问题的人都投了赞成票,那么MS可能会实现一些东西。

更新:只需阅读Brian Harry's blog,其中显示此请求正在他们的雷达上,并且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提供的扩展程序Code Search,可以在代码和工作项中进行搜索。

答案 10 :(得分:1)

This search for a file link explains how to find a file.我确实不得不考虑让它发挥作用的建议。

  1. cd&#34; C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ Common7 \ IDE&#34;
  2. tf dir&#34; $ / * .sql&#34; / recursive / server:http://mytfsserver:8080/tfs
  3. 在cd命令的情况下,我执行了cd命令,因为我正在寻找tf.exe文件。从该目录开始并添加整个路径更容易。既然我已经理解了如何使这项工作成功,我就会在引号中使用绝对路径。

    如果是tf搜索,我从服务器的根目录$/开始,我搜索了所有以sql结尾的文件,即*.sql。如果您不想从根开始,请改用"$/myproject/*.sql"

    哦!这并没有解决问题的文件部分搜索,但是我的Google搜索让我在这里找到其他链接中的文件。

答案 11 :(得分:1)

假设你有Notepad++,一个经常遗漏的功能是“在文件中查找”,这非常快,并附带过滤器,正则表达式,替换和所有N ++好东西。