Найти в файлах: Поиск по всему коду в Team Foundation Server - PullRequest
99 голосов
/ 03 сентября 2008

Есть ли способ поиска в последней версии каждого файла в TFS определенной строки или регулярного выражения? Вероятно, это единственное, что мне не хватает в Visual Source Safe ...

В настоящее время я выполняю Get Latest для всей кодовой базы и использую Windows Search, но это становится довольно болезненным с более чем 1 ГБ кода в 75 000 файлов.

РЕДАКТИРОВАТЬ : пробовал упомянутые powertools, но опция «Поиск по шаблону» появляется только для поиска по именам файлов, но не по содержимому.

ОБНОВЛЕНИЕ : Мы реализовали настраиваемый параметр поиска в существующей установке MOSS (Search Server).

Ответы [ 12 ]

56 голосов
/ 17 сентября 2008

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

14 голосов
/ 12 апреля 2014

В моем случае написание небольшой утилиты на 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 голосов
/ 06 апреля 2009

Существует еще одно альтернативное решение, которое кажется более привлекательным.

  1. Настройка поискового сервера - это может быть любая машина / сервер Windows
  2. Настройка службы уведомлений TFS * (Bissubscribe) чтобы получить, удалить, обновлять файлы каждый раз при регистрации случается. Так что это веб-сервис, который действует как слушатель на TFS сервер и обновляет / синхронизирует файлы и папки на сервере поиска. - это значительно повысит точность (поиск в реальном времени) и позволит избежать одноразовой загрузки периодических операций
  3. Настройка службы индексирования / windows индексированный поиск на поисковом сервере для корневой папки
  4. Предоставление веб-службы для возврата результаты поиска

Теперь со всеми вышеуказанными настройками у вас есть несколько вариантов для клиента:

  1. Настройка веб-страницы для вызова службы поиска и форматирование результатов для отображения на веб-странице - вы также можете интегрировать эту веб-страницу в Visual Studio (с помощью макроса или надстройки)
  2. Создайте интерфейс клиента Windows (winforms / wpf) для вызова службы поиска, форматирования результатов и отображения их в пользовательском интерфейсе - вы также можете интегрировать этот инструмент клиента в Visual Studio через VSPackages или надстройку

Обновление : Я пошел по этому пути, и он работал хорошо. Просто хотел добавить к этому.

Справочные ссылки:

  1. Используйте этот инструмент вместо bissubscribe.exe
  2. Обработка событий TFS
  3. Системные уведомления команды
13 голосов
/ 03 сентября 2008

Если вы установите TFS 2008 PowerTools, вы получите действие «Найти в системе управления версиями» в контекстном меню Team Explorer.

TFS2008 Электроинструменты

6 голосов
/ 10 февраля 2016

Теперь это возможно начиная с TFS 2015 с помощью плагина Code Search. https://marketplace.visualstudio.com/items?itemName=ms.vss-code-search

Поиск осуществляется через веб-интерфейс и не требует загрузки кода на локальный компьютер, что приятно.

6 голосов
/ 12 июня 2009

Хорошо,

  1. TFS2008 Электроинструменты делают не функцией поиска в файлах. «Инструменты поиска в управлении исходным кодом предоставляют возможность находить файлы и папки в управлении исходным кодом по элементу status или выражению подстановочный знак ».

  2. Существует программа для Windows с этой функцией, размещенная на CodePlex . Я только что установил и проверил это, и он работает хорошо.

6 голосов
/ 21 сентября 2008

Мы создали решение для управления исходным кодом Team Foundation Server (не SourceSafe, как вы упомянули), аналогичное тому, что предлагает Грант; Запланированный TF Get, Search Server Express. Однако IFilter, используемый для файлов C # (текст), не дал желаемых результатов, поэтому мы конвертируем исходные файлы в файлы .htm. Теперь мы можем добавить дополнительные метаданные в файлы, такие как:

  • Автор (мы определяем его как человека, который последний раз проверял файл)
  • Цветовое кодирование (в нашем списке задач)
  • Количество изменений, указывающих на потенциальные проблемы дизайна (в нашем списке задач)
  • Интеграция с VSTS IDE, например, функция SmartSearch Koders
  • и т.д.

Однако мы бы предпочли обработчик протокола для TFS Source Control и выделенный исходный код IFilter для гораздо более целенаправленного решения.

3 голосов
/ 17 декабря 2008

Другое решение заключается в использовании "Ctrl + Shift + F". Вы можете изменить местоположение поиска на локальный каталог, а не на решение или проект. Это займет место поиска на рабочем столе, и вам все равно потребуется получить последний код, но это позволит вам оставаться в Visual Studio для выполнения поиска.

1 голос
/ 03 ноября 2016

Если у вас есть Блокнот ++ , часто пропускается функция «Поиск в файлах», которая очень быстрая и поставляется с фильтрами, регулярными выражениями, заменой и всеми вкусностями N ++.

1 голос
/ 24 сентября 2016

В этом поиске ссылки на файл объясняется, как найти файл. Мне пришлось соваться с советом, чтобы заставить его работать.

  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".

Oh! Это не решает вопрос поиска в файлах, но мой поиск в Google привел меня сюда, чтобы найти файлы среди других ссылок.

...