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


102

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

目前,我在整个代码库上执行“获取最新信息”并使用Windows搜索,但是在75,000个文件中使用超过1GB的代码会非常麻烦。

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

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

Answers:


57

Team Foundation Server 2015(本地)和Visual Studio Team Services(云版本)都提供了内置支持,可在您的所有代码和工作项中进行搜索。

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

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

您可以在这里阅读有关此内容的更多信息:https : //www.visualstudio.com/zh-cn/docs/search/overview


2
请参阅下面的答案,并对其进行投票;)从TFS 2015起,现在可以使用该Code Search插件了。marketplace.visualstudio.com/items?itemName=ms.vss-code-search
deadlydog

当前,代码搜索仅可用于Visual Studio Team Services。对Team Foundation Server的支持正在开发中,并将包含在下一版本中。
paparush16年

现在可以在TFS 2017或更高版本中使用代码搜索。
csrowell

如果您尝试切换到该文档的2015版本:“请求的页面不可用于Team Foundation Server2015。”
AaronLS

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;
    }
}
}

13

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

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

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

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

更新:我确实走过这条路线,并且运行良好。只是想添加到此。

参考链接:

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

12

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

TFS2008电动工具


4
@muerte有趣的是,它们被称为“电动工具”。有人会说做回滚之类的事情是“基本功能”。:-)
伊恩持有人

好吧,您当然可以手动进行回滚,这不是一键式操作。也许应该是..
Jeff Atwood

3
很好的回答,死链接: microsoft.com/downloads/...
WCM

15
我认为只搜索文件/文件夹名称
Kiddo

9
-1电动工具不搜索文件内容,仅搜索文件/文件夹名称。
尤金·别列索夫斯基

6

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

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

但是,我们希望使用TFS源代码管理的协议处理程序,以及专用于源代码的IFilter来获得更具针对性的解决方案。


1
有什么计划开源.htm转换吗?
technomaologic

6

好的,

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

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


这是片状和慢,但似乎做它在锡说
保罗·迈克尔斯

我收到错误消息,就像这些人进入下面的链接一样。还有其他人遇到吗?tfssearchcode.codeplex.com/workitem/32475


3

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


4
无法解决在TFS代码版本中进行搜索的问题。
Craig

不是他们想要的。
戴夫

搜索未下载的内容时无用。最好使用grep / findstr。
杰米

2

假设您拥有Notepad ++,那么经常会错过的功能是“查找文件”,该功能非常快速,并带有过滤器,正则表达式,replace和所有N ++好东西。


1

该加载项声称具有您认为需要的功能:

团队基础赛


抱歉,我看不到它在哪里搜索文件?
Mark Glorie

4
通常,我较早下载了此插件集,它只允许您按作者,标签,日期等进行搜索,而不能在旧版本的文件中进行搜索...:\
Sandor Davidhazi,

1

此搜索文件链接说明了如何查找文件。 我确实必须仔细考虑建议才能使其正常工作。

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

对于cd命令,我执行cd命令是因为我正在寻找tf.exe文件。仅从该目录开始添加整个路径会更容易。现在,我了解了如何实现此目的,我将在引号中使用绝对路径。

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

哦! 这不能解决问题的文件搜索,但是我的Google搜索使我在这里可以找到其他链接中的文件。


1

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

尽管我怀疑这只是切换开关一样简单,但是如果所有查看过此问题的人都赞成,MS可能会实施一些措施。

更新:只需阅读Brian Harry的博客,该博客显示此请求已在他们的雷达上,并且Visual Studio的在线版本对将git用作vc的搜索提供了有限的支持:http : //blogs.msdn.com/b/ visualstudioalm / archive / 2015/02/13 /宣布对visual-studio-online-code-search.aspx进行有限的预览。由此看来,我认为可以说这只是时间问题...

更新2:现在提供了Microsoft提供的扩展,即代码搜索,它可以在代码以及工作项中进行搜索。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.