102

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

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

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

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

4

12 回答 12

60

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

你可以做简单的字符串搜索foo,比如布尔运算,foo OR bar或者更复杂的语言特定的事情,比如class:WebRequest

代码搜索过滤器语法截图

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

于 2008-09-17T01:34:39.647 回答
16

就我而言,用 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;
    }
}
}
于 2014-04-11T22:10:23.730 回答
13

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

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

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

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

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

参考链接:

  1. 使用此工具代替 bissubscribe.exe
  2. 处理 TFS 事件
  3. 团队系统通知
于 2009-04-06T17:45:24.030 回答
10

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

TFS2008 电动工具

于 2008-09-03T10:11:35.577 回答
6

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

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

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

于 2008-09-21T08:57:25.980 回答
6

好的,

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

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

于 2009-06-12T19:48:00.707 回答
6

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

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

于 2016-02-10T20:38:11.540 回答
3

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

于 2008-12-17T20:48:18.217 回答
1

目前没有开箱即用的方法,但有一个用户语音建议添加它:http: //visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2037649-implement-indexed-全文搜索工作项

虽然我怀疑它是否像拨动开关一样简单,但如果每个看过这个问题的人都投票支持它,MS 可能会实现一些东西。

更新:只需阅读Brian Harry 的博客,该博客显示此请求已引起他们的注意,并且 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 提供的扩展程序代码搜索,它可以在代码和工作项中进行搜索。

于 2015-09-30T00:35:33.810 回答
1

此文件链接搜索说明了如何查找文件。 我确实不得不四处寻找建议以使其发挥作用。

  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 搜索的情况下,我从服务器的根目录开始,$/并搜索所有以sqlie结尾的文件*.sql。如果您不想从根目录开始,请"$/myproject/*.sql"改用。

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

于 2016-09-24T01:33:51.210 回答
1

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

于 2016-11-03T10:47:33.620 回答
0

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

团队基金会伙伴

于 2008-10-16T20:24:32.377 回答