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

目前,我对整个代码库执行“获取最新”并使用 Windows 搜索,但是对于 75,000 个文件中超过 1GB 的代码,这会变得非常痛苦。

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

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

有帮助吗?

解决方案

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

其他提示

就我而言,用 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;
    }
}
}

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

  1. 设置搜索服务器 - 可以是任何 Windows 计算机/服务器
  2. 设置一个 TFS通知服务*(BissubScribe)每次发生检查时获取,删除,更新文件。因此,这是一个像TFS服务器上的侦听器一样起作用的Web服务,并更新/同步搜索服务器上的文件和文件夹。- 这将极大地提高准确性(实时搜索),并避免进行定期获取的一次性负载
  3. 在搜索服务器上设置索引服务/Windows索引搜索根文件夹
  4. 公开网络服务以返回搜索结果

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

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

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

参考链接:

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

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

TFS2008 电动工具

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

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

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

好的,

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

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

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

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

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

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

团队基础伙伴

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

  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 IE。 *.sql. 。如果你不想从根开始,那么使用 "$/myproject/*.sql" 反而。

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

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

目前还没有办法开箱即用地执行此操作,但有用户语音建议添加它: http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2037649-implement-indexed-full-text-search-of-work-items

虽然我怀疑这是否像拨动开关那么简单,但如果每个看过这个问题的人都投票支持它,微软可能会实施一些措施。

更新:刚刚读过 布莱恩·哈利的博客, ,这表明此请求已在他们的雷达范围内,并且 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: 现在有一个微软提供的扩展,代码搜索 它允许在代码和工作项中进行搜索。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top