Найти в файлах: поиск по всему коду в Team Foundation Server

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

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

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

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


person Mark Glorie    schedule 03.09.2008    source источник


Ответы (12)


Team Foundation Server 2015 (локальная версия) и Visual Studio Team Services (облачная версия) включают встроенную поддержку поиска по всему вашему коду и рабочим элементам.

Вы можете выполнять простой строковый поиск, например foo, логические операции, например foo OR bar, или более сложные специфичные для языка вещи, например class:WebRequest

снимок экрана с синтаксисом фильтра поиска кода

Подробнее об этом можно прочитать здесь: https://www.visualstudio.com/en-us/docs/search/overview

person Grant Holliday    schedule 17.09.2008
comment
См. Мой ответ ниже и проголосуйте за него;) Теперь это возможно с TFS 2015 с помощью плагина Code Search. marketplace.visualstudio.com/items?itemName=ms.vss-code- поиск - person deadlydog; 10.02.2016
comment
Поиск кода в настоящее время доступен только для Visual Studio Team Services. Поддержка Team Foundation Server находится в стадии разработки и будет включена в следующий выпуск. - person paparush; 10.08.2016
comment
Поиск кода теперь доступен в TFS 2017 или новее. - person csrowell; 13.03.2019
comment
Если вы попытаетесь переключиться на версию этого документа 2015 года: запрошенная страница недоступна для Team Foundation Server 2015. - person AaronLS; 02.04.2019
comment
не повезло с TFS 2012, верно? - person pabben; 13.04.2021

В моем случае помогло написание небольшой утилиты на 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;
    }
}
}
person Community    schedule 11.04.2014

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

  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. Системные уведомления группы
person Vin    schedule 06.04.2009

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

TFS2008 Power Tools

person markom    schedule 03.09.2008
comment
@muerte, забавно, что их называют «электроинструментами». Некоторые сказали бы, что выполнение чего-то вроде отката - это «базовая функциональность». :-) - person Iain Holder; 03.09.2008
comment
ну, конечно, можно сделать откат вручную, просто это не операция в один клик. Возможно, так и должно быть .. - person Jeff Atwood; 08.09.2008
comment
Хороший ответ, мертвая ссылка: microsoft. ru / downloads / - person wcm; 12.07.2010
comment
я думаю, что искать только имя файла / папки - person Kiddo; 04.01.2011
comment
-1 электроинструменты не ищут содержимое файла, а ищут только имена файлов / папок. - person Evgeniy Berezovsky; 25.07.2012

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

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

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

person GertGregers    schedule 21.09.2008
comment
Есть ли планы открыть исходный код преобразования .htm? - person technomalogical; 13.07.2010

Хорошо,

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

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

person Community    schedule 12.06.2009
comment
Он шелушащийся и медленный, но, кажется, делает то, что написано на банке. - person Paul Michaels; 28.05.2010
comment
Я получаю сообщение об ошибке, подобное тому, которое получили эти люди по ссылке ниже. Кто-нибудь еще испытывает это? tfssearchcode.codeplex.com/workitem/32475 - person strider; 09.10.2014


Другое решение - использовать «ctrl + shift + F». Вы можете изменить местоположение поиска на локальный каталог, а не на решение или проект. Это просто заменит поиск на рабочем столе, и вам все равно нужно будет получить последний код, но это позволит вам оставаться в Visual Studio для выполнения поиска.

person Todd    schedule 17.12.2008
comment
Не решает проблему поиска по версиям кода TFS. - person Craig; 21.01.2013
comment
Бесполезен для поиска содержимого, которое вы не загрузили. Можно также использовать grep / findstr. - person Jamie; 07.07.2016

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

person smirkingman    schedule 03.11.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".

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

person Greg    schedule 24.09.2016

В настоящее время нет возможности сделать это из коробки, но есть предложение User Voice для его добавления: http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2037649-implement-indexed-full-text-search-of-work-items

Хотя я сомневаюсь, что это так же просто, как щелкнуть выключателем, если бы все, кто просматривал этот вопрос, проголосовали за него, MS, вероятно, что-то реализовала бы.

Обновление: просто прочтите Блог Брайана Гарри, который показывает, что этот запрос находится на их радаре, а онлайн-версия 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, Поиск кода, который позволяет выполнять поиск как в коде, так и в рабочих элементах.

person jmoreno    schedule 30.09.2015

Эта надстройка утверждает, что обладает той функциональностью, которую, как мне кажется, вы ищете:

Sidekicks Team Foundation

person Paul G    schedule 16.10.2008
comment
Извините, я не вижу, где он предлагает поиск внутри файлов? - person Mark Glorie; 17.10.2008
comment
Обычно я загружал этот набор плагинов ранее, и он позволяет выполнять поиск только по автору, метке, дате и т. Д., Но не внутри старых версий файлов ...: \ - person Sandor Davidhazi; 27.10.2008