Знайти у файлах: Шукати весь код на сервері Team Foundation


102

Чи є спосіб пошуку в останній версії кожного файлу в TFS за певним рядком або регулярним виразом? Це, мабуть, єдине, що мені не вистачає у безпечному візуальному джерелі ...

В даний час я виконую найновішу інформацію на всій кодовій базі і використовую пошук Windows, але це стає дуже болісно, ​​коли понад 1 ГБ коду в 75 000 файлів.

РЕДАКТУВАННЯ : Спробував згадані джерела живлення, але параметр "Пошук підстановки" відображається лише для пошуку файлових файлів, а не вмісту.

ОНОВЛЕННЯ : Ми реалізували налаштований параметр пошуку в існуючій установці MOSS (Search Server).

Відповіді:


57

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

Ви можете виконувати прості пошукові рядки, наприклад foo, булеві операції на зразок, foo OR barабо складніші мовні речіclass:WebRequest

скріншот синтаксису фільтра пошуку за кодом

Більше про це можна прочитати тут: https://www.visualstudio.com/en-us/docs/search/overview


2
Дивіться мою відповідь нижче та підтверджуйте її;) Тепер це можливо, починаючи з TFS 2015, використовуючи Code Searchплагін. marketplace.visualstudio.com/items?itemName=ms.vss-code-search
deadlydog

Пошук кодів наразі доступний лише для служб команд Visual Studio. Підтримка Team Foundation Server знаходиться на стадії розробки, і вона буде включена до наступного випуску.
папаруш

Пошук за кодом тепер доступний у TFS 2017 або новіших версіях.
csrowell

Якщо ви спробуєте перейти на версію цього документа 2015 року: "Запитана сторінка недоступна для Team Foundation Server 2015."
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) для отримання, видалення та оновлення файлів кожного разу, коли трапляється реєстрація. Отже, це веб-сервіс, який діє як слухач на сервері TFS та оновлює / синхронізує файли та папки на сервері пошуку. - це значно підвищить точність (пошук у прямому ефірі) та уникне одноразового навантаження періодичних надходжень
  3. Налаштуйте пошук сервісу індексування / індексованого вікна на сервері пошуку кореневої папки
  4. Відкрийте веб-сервіс, щоб повернути результати пошуку

Тепер з усіма описаними вище параметрами для клієнта є кілька варіантів:

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

Оновлення : я йшов цим маршрутом, і він працював чудово. Просто хотів до цього додати.

Довідкові посилання:

  1. Використовуйте цей інструмент замість bissubscribe.exe
  2. Обробка подій TFS
  3. Повідомлення про командну систему

12

Якщо ви встановите TFS 2008 PowerTools, у меню Team Explorer правою кнопкою миші ви отримаєте дію "Знайти в контролі джерела".

TFS2008 Електроінструменти


4
@muerte смішно, що їх називають "електроінструментами". Дехто сказав, що робити щось на кшталт відкату - це «основна функціональність». :-)
Ієн Холдер

ну, ви, звичайно, можете зробити відкат вручну, це просто не операція одним клацанням миші. Можливо, так і має бути ..
Джефф Етвуд

3
Хороша відповідь, мертве посилання: microsoft.com/downloads/…
wcm

15
Я думаю, що шукати лише ім'я файлу / папки
Kiddo

9
-1 електроінструменти не шукають вміст файлів , лише імена файлів / папок.
Євген Бересовський

6

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

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

Однак ми вважаємо за краще протокол для управління джерелами TFS та виділений вихідний код IFilter для набагато більш цільового рішення.


1
Будь-які плани з відкритим кодом перетворення .htm?
техномалогічний

6

Добре,

  1. TFS2008 Електроінструменти не мають функції пошуку файлів. "Інструменти Find in Source Control забезпечують можливість пошуку файлів і папок у керуванні джерелом за статусом елемента або з виразом підстановки ."

  2. Існує програма Windows з цією функціональністю, розміщена на CodePlex . Я щойно це встановив і протестував, і він працює добре.


Це лускато і повільно, але, здається, виконує те, що написано на бляшанці
Пол Майклз

Я отримую помилку, як ці люди потрапили у посилання нижче. Хтось ще відчував це? tfssearchcode.codeplex.com/workitem/32475
стридер

6

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

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


Примітка: Пошук у коді наразі доступний лише для служб команди Visual Studio. Підтримка Team Foundation Server знаходиться на стадії розробки, і вона буде включена до наступного випуску.
Джеймі

3

Іншим рішенням є використання "ctrl + shift + F". Ви можете змінити місце пошуку в локальний каталог, а не на рішення чи проект. Це просто займе місце пошуку на робочому столі, і вам все одно знадобиться отримати останній код, але це дозволить вам залишитися в Visual Studio, щоб здійснити пошук.


4
Не вирішує питання пошуку через версії коду TFS.
Крейг

Не те, що хотіли.
Дейв

Марно для пошуку вмісту, який ви не завантажували. Можна також використовувати grep / findstr.
Джеймі

2

Якщо припустити, що у вас є Notepad ++ , часто пропускається функція "Знайти у файлах", яка надзвичайно швидка і постачається з фільтрами, регулярними виразами, заміною та всіма N ++ смакотами.


1

Цей додаток стверджує, що він має функціонал, який, на мою думку, ви прагнете:

Команда фонду Sidekicks


Вибачте, я не бачу, де він пропонує шукати файли?
Марк Глорі

4
Практично я завантажив цей набір плагінів раніше, і він дозволяє лише шукати за автором, міткою, датою тощо, але не всередині старих версій файлів ...: \
Sandor Davidhazi

1

Цей пошук посилання на файл пояснює, як знайти файл. Мені довелося гнатися за порадою, щоб це спрацювало.

  1. cd "C: \ Програмні файли (x86) \ Microsoft Visual Studio 12.0 \ Common7 \ IDE"
  2. tf dir "$ / *. sql" / рекурсивний / сервер: http: // mytfsserver: 8080 / tfs

У випадку команди cd я виконав команду cd, тому що шукав файл tf.exe. Простіше було починати з цього каталогу віршів, додаючи весь шлях. Тепер, коли я розумію, як зробити цю роботу, я б використав абсолютний шлях у лапках.

У разі пошуку tf, я почав у корені сервера з $/і шукав усі файли, які закінчились, sqlтобто *.sql. Якщо ви не хочете починати з кореня, тоді використовуйте "$/myproject/*.sql"замість цього.

Ой! Це не вирішує пошук файлової частини питання, але мій пошук в Google привів мене сюди, щоб знайти файли серед інших посилань.


1

Наразі це неможливо зробити з поля, але є голосова пропозиція користувача, щоб додати його: http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2037649-implement-indexed- повнотекстовий пошук-пошук предметів

Хоча я сумніваюся, це так просто, як перемикати комутатор, якби всі, хто переглянув це питання, проголосували за нього, МС, можливо, щось реалізує.

Оновлення. Просто прочитайте блог Брайана Гаррі , де цей запит відображається як на їх радарі, а Інтернет-версія Visual Studio має обмежену підтримку пошуку, де git використовується як vcs: http://blogs.msdn.com/b/ visualstudioalm / archive / 2015/02/13 / оголошення-обмежений перегляд для візуального студії-онлайн-коду-пошуку.aspx . З цього я думаю, що справедливо сказати, що це лише питання часу ...

Оновлення 2: Зараз існує розширення, передбачене Microsoft, пошук коду, який дозволяє здійснювати пошук у коді, а також у робочих елементах.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.