Znajdź w plikach: Przeszukaj cały kod w Team Foundation Server


102

Czy istnieje sposób przeszukiwania najnowszej wersji każdego pliku w programie TFS pod kątem określonego ciągu lub wyrażenia regularnego? To chyba jedyna rzecz, której brakuje mi w programie Visual Source Safe ...

Obecnie wykonuję Pobierz najnowsze dla całej bazy kodu i używam wyszukiwania systemu Windows, ale staje się to dość bolesne przy ponad 1 GB kodu w 75 000 plików.

EDYCJA : Wypróbowałem wspomniane elektronarzędzia, ale opcja „Wyszukiwanie wieloznaczne” wydaje się wyszukiwać tylko nazwy plików, a nie zawartość.

AKTUALIZACJA : Zaimplementowaliśmy niestandardową opcję wyszukiwania w istniejącej instalacji MOSS (Search Server).

Odpowiedzi:


57

Team Foundation Server 2015 (wersja lokalna) i Visual Studio Team Services (wersja w chmurze) obejmują wbudowaną obsługę wyszukiwania we wszystkich kodach i elementach roboczych.

Możesz wyszukiwać proste ciągi znaków, takie jak foooperacje logiczne, takie jak foo OR barlub bardziej złożone rzeczy specyficzne dla języka, takie jakclass:WebRequest

zrzut ekranu składni filtru wyszukiwania kodu

Możesz przeczytać więcej na ten temat tutaj: https://www.visualstudio.com/en-us/docs/search/overview


2
Zobacz moją odpowiedź poniżej i zagłosuj za nią;) Jest to teraz możliwe od TFS 2015 za pomocą Code Searchwtyczki. marketplace.visualstudio.com/items?itemName=ms.vss-code-search
deadlydog

Wyszukiwanie kodu jest obecnie dostępne tylko dla usług zespołu Visual Studio. Wsparcie dla Team Foundation Server jest w trakcie opracowywania i zostanie uwzględnione w następnej wersji.
paparush

Wyszukiwanie kodu jest teraz dostępne w programie TFS 2017 lub nowszym.
csrowell

Jeśli spróbujesz przełączyć się na wersję tego dokumentu 2015: „Żądana strona nie jest dostępna dla Team Foundation Server 2015”.
AaronLS

16

W moim przypadku pomogło napisanie małego narzędzia w C #. Linki, które mi pomogły - http://pascallaurin42.blogspot.com/2012/05/tfs-queries-searching-in-all-files-of.html

Jak wyświetlić listę plików projektu zespołowego za pomocą interfejsu TFS?

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

Jest jeszcze jedno alternatywne rozwiązanie, które wydaje się bardziej atrakcyjne.

  1. Skonfiguruj serwer wyszukiwania - może to być dowolny komputer / serwer z systemem Windows
  2. Skonfiguruj usługę powiadomień TFS * (Bissubscribe), aby pobierać, usuwać i aktualizować pliki za każdym razem, gdy nastąpi zameldowanie. Jest to więc usługa internetowa, która działa jak nasłuchiwanie na serwerze TFS i aktualizuje / synchronizuje pliki i foldery na serwerze wyszukiwania. - znacznie poprawi to dokładność (wyszukiwanie na żywo) i pozwoli uniknąć jednorazowego obciążenia związanego z okresowymi pobraniami
  3. Skonfiguruj usługę indeksowania / wyszukiwanie indeksowane systemu Windows na serwerze wyszukiwania dla folderu głównego
  4. Udostępniaj usługę internetową, aby zwracać wyniki wyszukiwania

Teraz, mając wszystkie powyższe ustawienia, masz kilka opcji dla klienta:

  1. Skonfiguruj stronę internetową, aby wywołać usługę wyszukiwania i sformatować wyniki w celu wyświetlenia na stronie internetowej - możesz również zintegrować tę stronę internetową w programie Visual Studio (za pomocą makra lub dodatku)
  2. Utwórz interfejs klienta systemu Windows (winforms / wpf), aby wywołać usługę wyszukiwania i sformatować wyniki oraz wyświetlić je w interfejsie użytkownika - możesz również zintegrować to narzędzie klienckie w programie Visual Studio za pośrednictwem pakietów VSP lub dodatku

Aktualizacja : poszedłem tą trasą i fajnie działa. Chciałem tylko coś do tego dodać.

Linki referencyjne:

  1. Użyj tego narzędzia zamiast bissubscribe.exe
  2. Obsługa zdarzeń TFS
  3. Powiadomienia systemu zespołu

12

Jeśli zainstalujesz TFS 2008 PowerTools, w menu prawym przyciskiem myszy Team Explorer pojawi się akcja „Znajdź w kontroli źródła”.

Elektronarzędzia TFS2008


4
@muerte to zabawne, że nazywa się je „elektronarzędziami”. Niektórzy powiedzieliby, że wykonanie czegoś takiego jak wycofywanie zmian to „podstawowa funkcjonalność”. :-)
Iain Holder

cóż, z pewnością możesz wykonać przywracanie ręcznie, to nie jest operacja jednym kliknięciem. Może tak powinno być…
Jeff Atwood,

3
Dobra odpowiedź, martwy link: microsoft.com/downloads/ ...
wcm

15
Myślę, że wyszukuje tylko nazwę pliku / folderu
Kiddo

9
-1 elektronarzędzia nie przeszukują zawartości plików , tylko nazwy plików / folderów.
Evgeniy Berezovsky,

6

Skonfigurowaliśmy rozwiązanie dla Team Foundation Server Source Control (nie SourceSafe, jak wspomniałeś) podobne do tego, które sugeruje Grant; zaplanowane TF Get, Search Server Express. Jednak filtr IFilter używany do plików C # (tekst) nie dawał oczekiwanych wyników, więc konwertujemy pliki źródłowe do plików .htm. Możemy teraz dodać dodatkowe metadane do plików, takie jak:

  • Autor (definiujemy go jako osobę, która ostatnio sprawdzała plik)
  • Kodowanie kolorami (na naszej liście rzeczy do zrobienia)
  • Liczba zmian wskazujących na potencjalne problemy projektowe (na naszej liście rzeczy do zrobienia)
  • Zintegruj się z VSTS IDE, takim jak funkcja Koders SmartSearch
  • itp.

Wolelibyśmy jednak obsługi protokołu do kontroli źródła TFS i dedykowanego kodu źródłowego IFilter, aby uzyskać znacznie bardziej ukierunkowane rozwiązanie.


1
Jakieś plany otwarcia konwersji .htm?
technomalogiczne 13.07.10

6

W porządku,

  1. Narzędzia TFS2008 nie mają funkcji wyszukiwania plików. „Find narzędziami kontroli źródła zapewniają możliwość lokalizowania plików i folderów w kontroli źródła przez elementu stanu lub z wieloznacznym wypowiedzi.”

  2. Istnieje program Windows z tą funkcją opublikowany w CodePlex . Właśnie zainstalowałem i przetestowałem to i działa dobrze.


Jest kruchy i powolny, ale wydaje się, że robi to, co mówi na puszce
Paul Michaels

Otrzymuję błąd taki jak te osoby w linku poniżej. Czy ktoś jeszcze tego doświadcza? tfssearchcode.codeplex.com/workitem/32475
strider

6

Jest to teraz możliwe od TFS 2015 przy użyciu Code Searchwtyczki.https://marketplace.visualstudio.com/items?itemName=ms.vss-code-search

Wyszukiwanie odbywa się za pośrednictwem interfejsu internetowego i nie wymaga pobierania kodu na komputer lokalny, co jest miłe.


Uwaga: Wyszukiwanie kodu jest obecnie dostępne tylko dla usług Visual Studio Team Services. Wsparcie dla Team Foundation Server jest w trakcie opracowywania i zostanie uwzględnione w następnej wersji.
Jamie

3

Innym rozwiązaniem jest użycie „ctrl + shift + F”. Możesz zmienić lokalizację wyszukiwania na katalog lokalny, a nie rozwiązanie lub projekt. To po prostu zajmie miejsce wyszukiwania na pulpicie i nadal będziesz potrzebować najnowszego kodu, ale pozwoli ci pozostać w programie Visual Studio w celu wyszukiwania.


4
Nie rozwiązuje problemu przeszukiwania wersji kodu TFS.
Craig,

Nie to, czego chcieli.
Dave

Bezużyteczne do wyszukiwania treści, których nie pobrałeś. Równie dobrze możesz użyć grep / findstr.
Jamie

2

Zakładając, że masz Notepad ++ , często pomijaną funkcją jest `` Znajdź w plikach '', która jest niezwykle szybka i zawiera filtry, wyrażenia regularne, zamianę i wszystkie dodatki N ++.


1

Ten dodatek twierdzi, że ma funkcjonalność, o której myślę, że szukasz:

Pomocnicy Fundacji Zespołu


Przepraszam, nie widzę, gdzie oferuje wyszukiwanie w plikach?
Mark Glorie,

4
Właściwie pobrałem ten zestaw wtyczek wcześniej i pozwala on tylko na wyszukiwanie według autora, etykiety, daty itp., Ale nie w starszych wersjach plików ...: \
Sandor Davidhazi

1

To wyszukiwanie łącza do pliku wyjaśnia, jak znaleźć plik. Musiałem grzebać w radach, żeby to zadziałało.

  1. cd „C: \ Program Files (x86) \ Microsoft Visual Studio 12.0 \ Common7 \ IDE”
  2. tf dir "$ / *. sql" / recursive / server: http: // mytfsserver: 8080 / tfs

W przypadku polecenia cd wykonałem polecenie cd, ponieważ szukałem pliku tf.exe. Łatwiej było po prostu zacząć od wersetów tego katalogu, dodając całą ścieżkę. Teraz, gdy rozumiem, jak to działa, użyłbym ścieżki bezwzględnej w cudzysłowach.

W przypadku wyszukiwania tf zacząłem od katalogu głównego serwera $/i szukałem wszystkich plików zakończonych sqlnp *.sql. Jeśli nie chcesz zaczynać od katalogu głównego, użyj"$/myproject/*.sql" zamiast tego.

O! Nie rozwiązuje to kwestii wyszukiwania w plikach, ale moja wyszukiwarka Google przyniosła mnie tutaj, aby znaleźć pliki między innymi linkami.


1

Obecnie nie ma sposobu, aby to zrobić po wyjęciu z pudełka, ale istnieje sugestia głosu użytkownika, aby ją dodać: http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2037649-implement-indexed- wyszukiwanie-pełnotekstowe-elementów-pracy

Chociaż wątpię, by było to tak proste, jak przesunięcie przełącznika, gdyby każdy, kto widział to pytanie, zagłosował za nim, MS prawdopodobnie by coś wdrożył.

Aktualizacja: po prostu przeczytaj blog Briana Harry'ego , na którym to żądanie jest widoczne na ich radarze, a wersja online programu Visual Studio ma ograniczone wsparcie dla wyszukiwania, gdzie git jest używany jako vcs: http://blogs.msdn.com/b/ visualstudioalm / archive / 2015/02/13 / announcing-limited-preview-for-visual-studio-online-code-search.aspx . Na tej podstawie myślę, że można powiedzieć, że to tylko kwestia czasu ...

Aktualizacja 2: Obecnie dostępne jest rozszerzenie dostarczone przez firmę Microsoft, Code Search, które umożliwia wyszukiwanie w kodzie, a także w elementach roboczych.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.