【问题标题】:Find in Files: Search all code in Team Foundation Server在文件中查找:在 Team Foundation Server 中搜索所有代码
【发布时间】:2019-01-08 21:09:03
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    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 开始。 marketplace.visualstudio.com/items?itemName=ms.vss-code-search
    • 代码搜索目前仅适用于 Visual Studio Team Services。对 Team Foundation Server 的支持正在开发中,并将包含在下一个版本中。
    • 代码搜索现在在 TFS 2017 或更高版本中可用。
    • 如果您尝试切换到该文档的 2015 版本:“请求的页面不适用于 Team Foundation Server 2015。”
    【解决方案2】:

    在我的例子中,用 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;
        }
    }
    }
    

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      参考链接:

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

      【讨论】:

        【解决方案4】:

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

        TFS2008 Power Tools

        【讨论】:

        • @muerte 有趣的是它们被称为“电动工具”。有人会说做类似回滚的事情是“基本功能”。 :-)
        • 嗯,手动回滚当然可以,不是一键操作。也许应该是..
        • 好答案,死链接:microsoft.com/downloads/…
        • 我认为只搜索文件/文件夹名称
        • -1 电动工具不搜索文件内容,只搜索文件/文件夹名称。
        【解决方案5】:

        我们已经为 Team Foundation Server 源代码控制(不是您提到的 SourceSafe)设置了类似于 Grant 建议的解决方案;预定的 TF Get,搜索服务器 Express。然而,用于 C# 文件(文本)的 IFilter 没有给出我们想要的结果,因此我们将源文件转换为 .htm 文件。我们现在可以向文件中添加额外的元数据,例如:

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

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

        【讨论】:

        • 有没有开源.htm转换的计划?
        【解决方案6】:

        好的,

        1. TFS2008 电动工具具有文件查找功能。 “在源代码管理工具中查找工具提供了通过项目的状态或使用通配符表达式在源代码管理中查找文件和文件夹的能力。”

        2. CodePlex 上发布了具有此功能的 Windows 程序。我刚刚安装并测试了它,它运行良好。

        【讨论】:

        • 它是片状和缓慢的,但似乎做到了它在锡上所说的
        • 我收到一个错误,就像这些人在下面的链接中得到的一样。还有其他人遇到这种情况吗? tfssearchcode.codeplex.com/workitem/32475
        【解决方案7】:

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

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

        【讨论】:

        • 注意:代码搜索目前仅适用于 Visual Studio Team Services。对 Team Foundation Server 的支持正在开发中,并将包含在下一个版本中。
        【解决方案8】:

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

        【讨论】:

        • 不解决搜索 TFS 代码版本的问题。
        • 对搜索没有下载的内容没用。不妨使用 grep/findstr.
        【解决方案9】:

        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" /recursive /server:http://mytfsserver:8080/tfs

        在 cd 命令的情况下,我执行 cd 命令是因为我正在寻找 tf.exe 文件。从该目录开始比添加整个路径更容易。现在我了解了如何进行这项工作,我将使用引号中的绝对路径。

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

        哦!这并不能解决问题的文件搜索部分,但我的 Google 搜索将我带到这里以在其他链接中查找文件。

        【讨论】:

          【解决方案10】:

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

          【讨论】:

            【解决方案11】:

            目前没有开箱即用的方法,但有一个用户语音建议添加它: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,它可以在代码和工作项中进行搜索。

            【讨论】:

              【解决方案12】:

              此插件声称具有我认为您寻求的功能:

              Team Foundation Sidekicks

              【讨论】:

              • 抱歉,我没有看到它提供的文件内部搜索功能?
              • 其实我之前下载了这个插件集,它只能让你按作者、标签、日期等搜索,但不能在旧版本的文件中搜索...:\
              猜你喜欢
              • 1970-01-01
              • 2010-10-03
              • 1970-01-01
              • 2013-05-31
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-10-25
              相关资源
              最近更新 更多