代码之家  ›  专栏  ›  技术社区  ›  Mark Glorie

在文件中查找:在Team Foundation服务器中搜索所有代码

  •  97
  • Mark Glorie  · 技术社区  · 16 年前

    有没有办法在tfs中搜索每个文件的最新版本以查找特定的字符串或regex?这可能是我唯一错过的东西从视觉源安全…

    目前,我对整个代码库执行了一个get-latest,并使用了Windows Search,但是这对于75000个文件中超过1GB的代码来说是非常痛苦的。

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

    更新 :我们在现有的moss(搜索服务器)安装中实现了自定义搜索选项。

    12 回复  |  直到 6 年前
        1
  •  56
  •   granth    7 年前

    Team Foundation Server 2015(Office)和VisualStudio Team Services(云版本)包括内置的用于跨所有代码和工作项搜索的支持。

    你可以像这样做简单的字符串搜索 foo ,布尔运算类似 foo OR bar 或者更复杂的语言特定的东西,比如 class:WebRequest

    screenshot of code search filter syntax

    您可以在这里阅读更多信息: https://www.visualstudio.com/en-us/docs/search/overview

        2
  •  13
  •   Vin    15 年前

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

    1. 设置搜索服务器-可以是任何Windows计算机/服务器
    2. 设置一个 TFS通知服务* (bissubscribe)获取、删除, 每次签入时更新文件 发生。所以这是一个Web服务 充当tfs上的侦听器 服务器,并更新/同步文件 和搜索服务器上的文件夹。- 这将大大提高准确度(实时搜索),并避免进行周期性获取的一次性负载。
    3. 设置索引服务/Windows 搜索服务器上的索引搜索 对于根文件夹
    4. 公开Web服务以返回 搜索结果

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

    1. 设置网页以调用搜索服务并格式化要在网页上显示的结果-您还可以将此网页集成到Visual Studio中(通过宏或加载项)
    2. 创建一个Windows客户端接口(winforms/wpf)来调用搜索服务并格式化结果并在UI上显示它们-您还可以通过vPackages或外接程序将此客户端工具集成到Visual Studio中。

    更新 : 我确实走了这条路,而且一直很好地工作。只是想补充一下。

    引用链接:

    1. Use this tool instead of bissubscribe.exe
    2. Handling TFS events
    3. Team System Notifications
        3
  •  13
  •   Phil Patterson    12 年前

    如果安装TFS 2008 Powertools,您将在团队资源管理器右键单击菜单中获得“在源代码管理中查找”操作。

    TFS2008 Power Tools

        4
  •  11
  •   community wiki 4 revs, 4 users 97% Vijayanand Settin    6 年前

    在我的例子中,用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;
        }
    }
    }
    
        5
  •  6
  •   GertGregers    16 年前

    我们已经为Team Foundation Server源代码管理(未提及的SooSeCeFe)设置了一个解决方案,类似于Grand建议的、计划的TF GET、Search Server Express。但是,用于c文件(文本)的ifilter没有给出我们想要的结果,因此我们将源文件转换为.htm文件。我们现在可以向文件中添加其他元数据,例如:

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

    但是,我们更喜欢用于TFS源代码控制的ProtocolHandler,以及用于更具针对性的解决方案的专用源代码ifilter。

        6
  •  6
  •   abatishchev Karl Johan    14 年前

    可以,

    1. TFS2008电动工具 具有“在文件中查找”功能。““在源代码管理中查找”工具提供了按项在源代码管理中查找文件和文件夹的功能。 地位 或与 通配符 表达。”

    2. 有一个Windows程序发布了此功能 CodePlex . 我刚刚安装并测试了这个,它工作得很好。

        7
  •  6
  •   deadlydog    9 年前

    现在,通过使用 Code Search 插件。 https://marketplace.visualstudio.com/items?itemName=ms.vss-code-search

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

        8
  •  3
  •   Todd    16 年前

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

        9
  •  1
  •   Paul G    16 年前

    此加载项声称具有我相信您所寻求的功能:

    Team Foundation Sidekicks

        10
  •  1
  •   Greg    8 年前

    This search for a file link explains how to find a file. 我真的不得不胡乱地提建议才能使它起作用。

    1. CD“C:\Program Files(x86)\Microsoft Visual Studio 12.0\Common7\IDE”
    2. tf dir“$/*.sql”/递归/服务器: http://mytfsserver:8080/tfs

    对于cd命令,我执行cd命令是因为我在查找tf.exe文件。从这个目录开始添加整个路径比较容易。既然我了解了如何实现这一点,我将使用引号中的绝对路径。

    在tf搜索的情况下,我从服务器的根目录开始 $/ 我搜索了所有以 sql *.sql . 如果不想从根目录开始,则使用 "$/myproject/*.sql" 相反。

    哦!这并不能解决“在文件中搜索”这一部分的问题,但我的谷歌搜索让我来到这里,在其他链接中查找文件。

        11
  •  1
  •   smirkingman    8 年前

    假设你有 Notepad++ “在文件中查找”是一个经常被忽略的功能,它非常快,并且附带了过滤器、正则表达式、替换和所有N++的优点。

        12
  •  1
  •   jmoreno    6 年前

    目前没有现成的方法,但有一个用户语音建议添加它: http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2037649-implement-indexed-full-text-search-of-work-items

    尽管我怀疑这是否像扳动开关一样简单,但如果每个看过这个问题的人都投了赞成票,微软可能会实施一些措施。

    更新:刚刚阅读 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: 现在有一个微软提供的扩展, Code Search 它可以在代码和工作项中进行搜索。